2015-04-03 3 views
1

В композиции один класс явно содержит другой. Однако в Inheritance базовый класс неявно содержится в производном классе. Правильно или нет? Я спрашиваю об этом, потому что после нескольких дней изучения наследования, только сегодня я где-то читал, что объект производного класса всегда содержит объект его базового класса.Наследование и композиция :: Правильно ли я понимаю?

Я имею в виду, что я думал, что будет только один объект, и только функциональность будет унаследована, но я не знал, что он также будет содержать объект базового класса внутри.

+0

Вы спрашиваете, не содержится ли в явном виде объект базового класса или явно содержится? Или вы спрашиваете, содержится ли это вообще? – juanchopanza

ответ

1

В состав, один объект содержал другой объект. В то время как в наследовании ваш объект приобретает свойства базового класса.

Я имею в виду, я думал, что там будет только один объект и только функциональность будет наследоваться, но я не знал, что он будет также содержать объект базового класса внутри.

Да, вы правы, наследуется только один объект и функциональность. Даже если ваш базовый класс имеет переменные-члены, размер будет добавлен к размеру вашего объекта.

Вы можете напрямую вызвать общедоступные и защищенные методы базового класса. Во время cointainership вы можете получить доступ к общественным методам.

+0

, так как это C++, возможно, стоит упомянуть угловой случай, что объекты не могут иметь размер 0, но наследование пустых структур может не увеличить размер вашего объекта. – Alex

1

Это должно быть: В составе один класс явно содержит объект другого класса. Однако в Inheritance базовый класс неявно содержится в производном классе.

Вкратце: Состав относится к отношениям между классом и объектом. Наследование - это отношение класса и класса.

И, пожалуйста, помните «Предпочитайте композицию над наследованием». Prefer composition over inheritance?

1

Рассмотрим код:

class Engine 
{ 
//Some Code 
}; 

class Vehicle 
{ 
//Some Code 
}; 

class Car:Vehicle 
{ 
    Engine engine; 
    //Some Code 
}; 

В этом случае автомобиль класса наследует класс автомобиля. Объект класса Car не содержит объект Vehicle, скорее это объект класса Vehicle (Inheritance). С другой стороны, он содержит объект класса Engine (Composition).

Тот факт, что вы можете получить доступ к функции родителя с помощью this, исходит из того, что объект Car является транспортным средством не потому, что он содержит объект Vehicle.

1

В общем производном классе содержатся все члены данных и обмениваются свойствами/методами базового класса, но существует разница между композицией и наследованием.

Под «композицией» вы подразумеваете, что один объект имеет «другой» объект. В примере: у человека есть печень. В конструкции класса он может быть представлен, как показано ниже:

class Liver {}; 

class Human 
{ 
public: 
    Human() {} 
private: 
    Liver mLiver; 
} 

Когда речь идет о наследовании, есть 2 вариант: открытое наследование грубо говорит, что один объект «является» своим родом другого объекта. В примере: Человек - это своего рода живое существо.Естественно, естественно, что человек «имеет» живое существо внутри. Открытое наследование является способом пойти в таком случае:

class LivingCreature {}; 

class Human : public LivingCreature 
{ 
public: 
    Human() {} 
} 

Другой вариант защищен/частное наследование, которое должно быть использовано для реализации какой-либо объект «с точки зрения» другого объекта. Как правило, он также может рассматриваться как состав, но первый подход обычно лучше.

Сведение:

  • Если вы можете сказать, что один объект «является» своего рода другой, более общего объекта: открытое наследование является лучшим способом пойти,
  • Если вы можете сказать, что один объект «имеет» другой объект: использовать композицию.
1

В составе один класс явно содержит другой. Однако в Inheritance базовый класс неявно содержится в производном классе. Правильно или нет?

Это полностью вопрос знаний/точки зрения: если вы знаете, что наследование означает экземпляр базового класса будет встраиваться в производном классе, то говоря class Dervived : Base можно рассматривать как явно с просьбой, в то время как если вы что определение переменной внутри class X означает, что это переменная-член, которая будет содержаться в экземплярах X, что также можно рассматривать как явные.

Я прошу об этом, потому что после нескольких дней изучения наследования, только сегодня я где-то читал, что объект производного класса всегда содержит объект его [sic] базового класса.

Различие между фактически содержащий объект vs. базового класса через некоторые более неопределенные/Таинственные означает быть взаимозаменяемыми для экземпляра базового класса по случаю, не обязательно самое главное при запуске, чтобы узнать о наследстве, так легко представить, что это не подчеркивается во всех учебных материалах.

Я имею в виду, что я думал, что будет только один объект, и только функциональность будет наследоваться, но я не знал, что он также будет содержать объект базового класса внутри.

На уровне реализации важно, чтобы на самом деле он содержал экземпляр базового класса, поэтому код, скомпилированный для обработки объектов базового класса, может одинаково хорошо работать на экземплярах производного класса. Стандарт C++ мог бы иметь, считая его просто встроенной копией содержимого базового класса с идентичным двоичным макетом, а не фактическим объектом базового класса, но тогда необходимо добавить огромное количество текста в Стандарте, чтобы упомянуть, что производные объекты может использоваться в сценариях, где допустимым является экземпляр базового класса. Другими словами, различие является несколько произвольным, но для всех это проще, если он интуитивно понятен и естественным образом подходит к более простой и более сжатой стандартной формулировке.

0

Наследование - Состав: Я понимаю, что это правильно?

концептуальные различия:

Наследование:

В случае наследования, производный класс является подтип базового класса. Значение, если вы черпаете Dog из Animal, то DogявляетсяAnimal и все * операции, которые могут быть выполнены на Animal могут быть выполнены на Dog.

  • Использование private, protected и public наследство, однако, вы можете контролировать, кто знает что Dog является Animal и кто знает внутреннюю работу Animal. В случае protected или private только наследование Dog будет знать, что это Animal, но это не будет очевидно извне.

Состав:

В случае композиции одного класса входит в другую. a Car не является Wheel. Но он содержит Wheel. Поэтому операции, которые работают на Wheel, не будут работать на Car.

Объявляя переменную-член типа Wheelpublic, как, 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; 
}; 

В случае множественного наследования и наследования алмазов вещей будет получить сложнее и базовый класс может быть включено несколько раз.

Смежные вопросы