О вызове конструктора для базового и производного класса - PullRequest
3 голосов
/ 09 января 2012

Я новичок в C ++, и я только начал изучать полиморфизм. Я знаю, что если я создаю объект для производного класса, то вызывается конструктор как производного, так и базового класса. Означает ли это, что когда я создаю объект для производного класса, в итоге я получаю два объекта: один создается конструктором базового класса, а другой - конструктором производного класса?

Может кто-нибудь объяснить, какова задача конструктора базового класса, когда я хочу создать объект для производного класса.

Ответы [ 7 ]

10 голосов
/ 09 января 2012

Задача конструктора базового класса - инициализировать переменные-члены базового класса (рассмотрим случай переменной-члена private в базовом классе).

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

2 голосов
/ 09 января 2012

Конструкторы не выделяют пространство и инициируют экземпляры объектов; они инициализируют объект сразу после выделения пространства.

Когда вы объявляете объект в стеке или используете new , сначала зарезервируется память и создается объект, затем выполняются конструкторы, начиная с базового конструктора и продвигаясь вверх к самому производному классу.

1 голос
/ 09 января 2012

Независимо от того, создаете ли вы object из base class или derived class, вы получите один объект.

То, что вызывается конструктор базового класса, не означает, что вы получите один дополнительный объект для этого вызова. Здесь будет выполняться b ase class constructor, который обычно устанавливает атрибуты базового класса. В целом объект будет состоять из свойств базового класса и свойств производного класса.

1 голос
/ 09 января 2012

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

Конструкторы волшебным образом не создают другой экземпляр объекта.Они инициализируют определенный фрагмент памяти, но вызов конструктора и выделение памяти - это не одно и то же - последнее выполняется либо за кулисами (для объектов с автоматическим и статическим временем хранения), либо с new и malloc (для объектов с динамическим сроком хранения).

РЕДАКТИРОВАТЬ: Прежде чем я получаю гневные комментарии об этом: «за кулисами» это неопределенный способ выразить это;определение объекта с автоматическим или статическим сроком хранения гарантирует, что он получает память.

0 голосов
/ 01 марта 2016

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

0 голосов
/ 09 января 2012

Когда мы создаем объект, вызывается конструктор. Это не когда конструктор вызывает объект.

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

Предположим, что A является базовым классом, а B является производным классом,

класс А {

}

класс B: общедоступный A {

}

Мы будем создавать объект для класса A следующими способами:

A obja;

or 

A obja = new A();

В обоих случаях можно предположить, что вызывается функция Create,

A::Create()
{
   A();
}

Если вы создаете объект производного класса B, будет вызван метод Create для B,

Итак, метод Create внутри B будет выглядеть ниже,

B::Create()
{
  B();
  A();
}

Итак, когда мы создаем объект производного класса, сначала происходит инициализация производного класса, а затем происходит инициализация базового класса. Это не значит, что объект создан дважды.

Объект будет создан для вызова, где вы создаете объект с помощью.

B obj;

или

B obj = новый B ();

Вызов конструкторов является внутренней функциональностью, так как конструкторы вызываются в функции Create.

Примечание: Create функция в вышеприведенном коде выполняется только в иллюстративных целях.

0 голосов
/ 09 января 2012

Если у вас есть класс, вам придется определить конструктор или конструкторы (существуют определенные обстоятельства, когда вам не нужно). Целью конструктора является инициализация членов данных класса, а вы присваиваете значение его членам данных. Любой элемент данных, для которого вы не присваиваете ему значение, будет иметь неопределенное значение, если только элемент данных не является экземпляром класса, который имеет конструктор по умолчанию.

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

Если у вас есть производный класс, вы можете добавить в него членов данных, но помните, что он также имеет унаследованный член: базовый класс. Поэтому, когда вы определяете конструктор в своем производном классе, вы должны вызывать конструктор базового класса (чтобы члены базового класса полностью инициализировались) и присваивать значение собственным членам данных производного класса.

Итак, вы создаете экземпляр производного класса, конструктор производного класса включается. В рамках своей функциональности он вызывает конструктор своего базового класса (можно сказать, два конструктора, но это неправильно для его просмотра).

Если вы создаете экземпляр базового класса, вызывается только этот конструктор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...