Kala Lala Ответов: 1

Нужно объяснение в вызове конструктора, в унаследованных классах?


#include<iostream>
using namespace std;
 
class A
{
public:
  A()  { cout << "A's constructor called" << endl; }
};
 
class B
{
public:
  B()  { cout << "B's constructor called" << endl; }
};
 
class C: public B, public A  // Note the order
{
public:
  C()  { cout << "C's constructor called" << endl; }
};
 
int main()
{
    C c;
    return 0;
}


Мой вопрос заключается в том, почему конструктор класса B/A вызывается автоматически, когда я создаю объект класса c


выход есть
B's constructor called
A's constructor called
C's constructor called


Что я уже пробовал:

google.com и еще stackoverflow.com

KarstenK

Избегайте такого наследия, потому что оно определено в C++, в каком порядке вызываются конструкторы. Таким образом, решение 1 является правильным для некоторого странного поведения.

1 Ответов

Рейтинг:
9

OriginalGriff

C является производным как от A, так и от B - поэтому, прежде чем конструктор для C может быть выполнен, конструкторы для A и B должны быть завершены. Если это не так, то конструктор с не может полагаться ни на что из того, что предоставляют его базовые классы.

Например, предположим, что A содержит список элементов, который создается и хранится из базы данных в ее конструкторе. Все экземпляры A могут полагаться на то, что список будет завершен, потому что конструктор должен быть завершен до того, как экземпляр станет доступен для остальной части кода. Но с - это также и А - оно происходит от него так же, как "Форд" - это также "автомобиль", поэтому он вполне может захотеть получить доступ к этому списку. При создании экземпляра конструкторы базового класса автоматически вызываются перед производными классами, чтобы убедиться, что все готово к действию при запуске производного конструктора.

Например, слегка измените свой код:

class A
{
public:
A() { cout << "A's constructor called" << endl; }
};

class B: public A
{
public:
B() { cout << "B's constructor called" << endl; }
};

class C: public B
{
public:
C() { cout << "C's constructor called" << endl; }
};

int main()
{
C c;
return 0;
}
и вы получите:
A's constructor called
B's constructor called
C's constructor called  
Потому что все конструкторы базового класса завершаются до выполнения производных.


Kala Lala

очень хорошее объяснение, сэр,спасибо

OriginalGriff

Всегда пожалуйста!