Почему называется базовый конструктор? - PullRequest
2 голосов
/ 10 апреля 2011

Хорошо, у меня очень простой вопрос, поэтому, пожалуйста, будьте осторожны со мной.
В следующем коде:

#include<iostream>    

class base
{
      public:
             base() { std::cout << "Base()" << std::endl; }
};

class derived: base {
      public:
             derived() { std::cout << "Derived()" << std::endl; }
             };
int main() {
derived d;
}

Вывод:

База ()

Derived ()

Я хотел бы знать, почему вызывается конструктор класса base, хотя я создаю объект класса derived? Я не смог найти правильный ответ в FAQ.

Ответы [ 3 ]

7 голосов
/ 10 апреля 2011

Конструктор класса base вызывается для инициализации подобъекта класса base, который содержится в derived. Вот как работает наследование, это упрощает следование принципу замены Лискова .

Рассмотрим следующее:

class base
{
public:
  base() : x(10) { std::cout << "Base()" << std::endl; }
private:
   int x;
};

class derived: base {
public:
  derived() { std::cout << "Derived()" << std::endl; }
};

Как бы вы инициализировали член base::x без вызова конструктора базового класса?


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

5 голосов
/ 10 апреля 2011

Производный объект, по определению, также является базовым объектом.

3 голосов
/ 10 апреля 2011
Объект

A Derived всегда должен использоваться вместо объекта Base. Если Base имеет закрытые члены, которые должны быть должным образом инициализированы для работы Base, это, вероятно, выполняется в конструкторе, поэтому конструктор Base всегда должен вызываться.

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