Наследование - Состав: Я понимаю, что это правильно?
концептуальные различия:
Наследование:
В случае наследования, производный класс является подтип базового класса. Значение, если вы черпаете Dog
из Animal
, то Dog
являетсяAnimal
и все * операции, которые могут быть выполнены на Animal
могут быть выполнены на Dog
.
- Использование
private
, protected
и public
наследство, однако, вы можете контролировать, кто знает что Dog
является Animal
и кто знает внутреннюю работу Animal
. В случае protected
или private
только наследование Dog
будет знать, что это Animal
, но это не будет очевидно извне.
Состав:
В случае композиции одного класса входит в другую. a Car
не является Wheel
. Но он содержит Wheel
. Поэтому операции, которые работают на Wheel
, не будут работать на Car
.
Объявляя переменную-член типа Wheel
public
, как, private
или protected
вы можете контролировать, кто может получить доступ к Car
«s Wheel
с.
Я считаю, что это достаточно ясно?
Детали реализации:
В случае C++, члены базового класса включены в производный класс. Также методы, которые существовали в базовом классе, будут доступны в производном классе - где-то. Спецификаторы доступа private
, public
и protected
И тип наследования определяет, какие методы видны и где.
Я думал, что там будет только один объект
Это один объект.
В объектах Microsoft компилятора и G ++ «сливаются» вместе, а это означает, что в случае:
struct Base{
int a;
};
strict Derived: public Base{
int b;
};
Derived
внутренне будет вероятно (нужно будет проверить C++ стандарт, чтобы быть уверенным), имеют этот формат.
strict Derived{
int a;
int c;
};
или
struct Derived{
Base _;
int c;
};
В случае множественного наследования и наследования алмазов вещей будет получить сложнее и базовый класс может быть включено несколько раз.
Вы спрашиваете, не содержится ли в явном виде объект базового класса или явно содержится? Или вы спрашиваете, содержится ли это вообще? – juanchopanza