Я должен добавить к предыдущим ответам, потому что все, кажется, игнорируют его
Если у вас есть производный экземпляр класса, являющийся созданным , то верно, что код внутри конструктора base будет называться до кода внутри конструктора производного , но имейте в виду, что производное все еще технически "создано" до база .
И когда у вас вызывается деструктор производного класса, это правда, что код внутри производного деструктора до * 1038 называется код внутри деструктора базы, но также имейте в виду, что база уничтожена до * * получена одна тысяча сорок-девять .
Когда я говорю создано / уничтожено Я на самом деле имею в виду выделено / освобождено .
Если вы посмотрите на структуру памяти этих экземпляров, вы увидите, что производный экземпляр составляет базовый экземпляр. Например:
Память производных: от 0x00001110 до 0x00001120
Память базы: от 0x00001114 до 0x00001118
Следовательно, производному классу должна быть выделена ДО база в конструкции. И производный класс должен быть освобожден ПОСЛЕ базы в уничтожении.
Если у вас есть следующий код:
class Base
{
public:
Base()
{
std::cout << "\n Base created";
}
virtual ~Base()
{
std::cout << "\n Base destroyed";
}
}
class Derived : public Base
{
public:
Derived()
// Derived is allocated here
// then Base constructor is called to allocate base and prepare it
{
std::cout << "\n Derived created";
}
~Derived()
{
std::cout << "\n Derived destroyed";
}
// Base destructor is called here
// then Derived is deallocated
}
Итак, если вы создали Derived d;
и вывели его из области видимости, тогда вы получите вывод в ответе @ Brian. Но поведение объекта в памяти на самом деле не в том же порядке, оно выглядит примерно так:
Конструкция:
Производное выделено
База выделена
Базовый конструктор называется
Производный конструктор с именем
Уничтожение:
Производный деструктор с именем
Базовый деструктор называется
База освобождена
Производные освобождены