(30.04.2022)
Методы - функции класса или структуры
Если вы хотите ограничить видимость некоторых методов и данных от пользователя библиотеки (Тк методы и поля могут поменяться в дальшейшем, что не должно ломать код, который раньше использовал вашу библиотеку)
private
public
protected
(про наследование)У
struct
по умолчанию модификатор доступаpublic
Уclass
по умолчанию модификатор доступаprivate
Больше различий НЕТ!
Как обратиться к private
полям и методам если очень хочется
(Можно сделать через ключи компиляции)
Дефайны через ключи компиляции задают
define
на все файлы, если есть такой-жеdefine
в коде он переопредилит значние на новое (два одинаковыхdefine
не ошибка, варнинг, новый его переопределит)
Когда у нас есть два класа, которые делают похожие вещи, но немного поразному. Надо выделить общее - родительский класс, и наследовать от него разные реализации
protected
поля не видны для окружающего мира, но видны наследникам
способ наследования понижает видимость до той, что мы указали
public
ничего не меняетprotected
сделает public
поля класса A
полями типа protected
private
сделает public
и protected
поля класса A
полями типа private
(к ним будет доступ из B
, естественно)
friend
можно обьявлять в любом месте класса, и не может быть использован для доступа кprivate
полям родителя.
Любят писать, что конструкторы и деструкторы не наследуются, но не все понимают, что это значит
Конструкторы наследуются, но не переходят к наследнику
Сначала вызовется деструктор
B
, затем он вызывает деструкторA
.
Конструкторы не бывают виртуальным (очевидно) Деструкторы бывают виртуальными (очевидно)
Таблица виртуальных функций лежит в
A
и это дополнительный вызов в память
виртуальные функции будут виртуальными во всех наследниках по умолчанию
Можно написать virtual f() = 0;
, означает что здесь нет реализации f
, этот класс будет абстрактным. Мы не сможем создать копию абстрактного класса, но можем создать на него указатель. Абстрактный класс не жизнеспособен самостоятельно, но жизнеспособен (и его копия есть) в составе наследника, который реализовал все абстрактные функции.
(можно написать только для virtual
и 0
)
(есть только в C++ и Python)
Представим ситуацию
B
и C
наследуются от A
, D
наследуется от B
и C
.
В
D
будет две разные реализации A!
Можно обьединить, надо поставить модификатор virtual
в классах B
и C
при наследование от A
- class B : virtual public A
. (не бесплатно, тоже таблица виртуальности)
virtual
ставишь там где раcходятся реализацции на класс который не хочешь чтобы в будущем размножился.