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: Так что же происходит, когда вы вызываете конструктор подкласса с входными данными? Вызывается ли также «пустой конструктор» суперкласса?

Ответы на вопрос(7)

Ваш ответ на вопрос