C ++ Конструктор / Деструктор наследования
РЕДАКТИРОВАТЬ: Резюме ответов
В дальнейшем B является подклассом A.
Это вопрос терминологии; ctors и dtors являютсяне наследуется в том смысле, что Ctor / Dtor B будетне быть заимствованным из интерфейса А. Класс имеет по крайней мере один конструктор и имеет ровно один деструктор.
Конструкторы:B не наследует конструкторов от A;Если только Ктор явно не звонитодин из Ctor A, ctor по умолчанию из A будет вызываться автоматическидо Тело ctor B (идея состоит в том, что A нужно инициализировать перед созданием B).деструкторы:B не наследует Dtor A;После это выходит, деструктор B автоматически вызовет деструктор A.Подтверждения: Я хотел бы особенно поблагодарить Оли Чарльзуорта и Коса за их ответы, я выбрал решение Коса как решение, потому что оно было тем, которое я понял лучше всего.
ОРИГИНАЛЬНАЯ ПОЧТА
При поиске в Google сайта наследования деструктора C ++: stackoverflow.com в настоящее время вы обнаружите следующие сообщения:
Наследование конструктора и деструктора: два пользователя с репутацией 30k + говорят, что это наследуется, а что нетУнаследованы ли виртуальные деструкторы?: здесь не упоминается ничего, что указывало бы на то, что деструкторы не наследуютсяДеструкторы и наследование в C ++?: Комментарии, кажется, указывают на то, что деструкторы наследуютсяQ1: Что я также знаю из практики, это то, что вы не можете инициализировать производный объект с тем же прототипом, что и его родительский конструктор, без явного определения конструктора для производного класса, это правильно?
Несмотря на то, что из сообщений довольно ясно, что деструкторы, кажется, унаследованы, я все еще озадачен тем фактом, что пользователь с репутацией 32k сказал бы, что это не так. Я написал небольшой пример, который должен прояснить мнение каждого:
#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: Так что же происходит, когда вы вызываете конструктор подкласса с входными данными? Вызывается ли также «пустой конструктор» суперкласса?