EDIT: краткое изложение ответов
В дальнейшем B является подклассом A.
Это вопрос терминологии; ctors и dtors не унаследованы в том смысле, что ctor/dtor of B не будет заимствован из интерфейса A. Класс имеет хотя бы один конструктор и имеет ровно один деструктор.
- Конструкторы:
- B не наследует конструкторы от A;
- Если B ctor явно вызывает один из A ctor, по умолчанию ctor из A будет вызываться автоматически перед телом B ctor (идея состоит в том, что A необходимо инициализировать до создания B).
- деструкторы:
- B не наследует A dtor;
- После того, как он выйдет, деструктор B автоматически вызовет деструктор.
Выражение признательности: Я хотел бы поблагодарить особенно Оли Чарльворта и Коса за их ответы, и я поставил решение "Кос" в качестве решения, потому что это был тот, который я лучше всего понял.
ОРИГИНАЛЬНАЯ ПОЧТА
Когда вы ищете "сайт наследования деструктора С++: stackoverflow.com" в Google, вы в настоящее время находите следующие сообщения:
- Наследование конструктора и деструктора: два пользователя с репутацией 30k + говорят, что они наследуются и что это не
- Наследуются виртуальные деструкторы?: здесь ничего не упоминается, что указывает на то, что деструкторы не наследуются
- Деструкторы и наследование в С++?: комментарии показывают, что деструкторы наследуются
Q1: То, что я также знаю из практики, заключается в том, что вы не можете инициализировать производный объект с помощью того же прототипа, что и его родительский конструктор, без явно определяющего конструктор для производного класса, является ли это правильным?
Несмотря на то, что из сообщений, которые, как представляется, унаследованы, достаточно ясно, что я все еще озадачен тем фактом, что пользователь с 32-кратной репутацией скажет, что это не так. Я написал небольшой пример, который должен прояснить все мысли:
#include <cstdio>
/******************************/
// Base class
struct A
{
A() { printf( "\tInstance counter = %d (ctor)\n", ++instance_counter ); }
~A() { printf( "\tInstance counter = %d (dtor)\n", --instance_counter ); }
static int instance_counter;
};
// Inherited class with default ctor/dtor
class B : public A {};
// Inherited class with defined ctor/dtor
struct C : public A
{
C() { printf("\tC says hi!\n"); }
~C() { printf("\tC says bye!\n"); }
};
/******************************/
// Initialize counter
int A::instance_counter = 0;
/******************************/
// A few tests
int main()
{
printf("Create A\n"); A a;
printf("Delete A\n"); a.~A();
printf("Create B\n"); B b;
printf("Delete B\n"); b.~B();
printf("Create new B stored as A*\n"); A *a_ptr = new B();
printf("Delete previous pointer\n"); delete a_ptr;
printf("Create C\n"); C c;
printf("Delete C\n"); c.~C();
}
и вот результат (скомпилированный с g++ 4.4.3):
Create A
Instance counter = 1 (ctor)
Delete A
Instance counter = 0 (dtor)
Create B
Instance counter = 1 (ctor)
Delete B
Instance counter = 0 (dtor)
Create new B stored as A*
Instance counter = 1 (ctor)
Delete previous pointer
Instance counter = 0 (dtor)
Create C
Instance counter = 1 (ctor)
C says hi!
Delete C
C says bye!
Instance counter = 0 (dtor) // We exit main() now
C says bye!
Instance counter = -1 (dtor)
Instance counter = -2 (dtor)
Instance counter = -3 (dtor)
Q2: Может ли кто-нибудь, кто считает, что это не унаследовал, объясните, что?
Q3: Итак, что происходит, когда вы вызываете конструктор подкласса со входами? Вызывается также "пустой конструктор" суперкласса?