编辑: 答案摘要
在下面的例子中,B 是 A 的一个子类。
这是一个术语问题; ctor 和 dtor 是 没有继承的,从这个意义上说,B 的 ctor/dtor 将从 A 的接口借用 没有。一个类至少有一个构造函数,并且只有一个析构函数。
鸣谢: 我想特别感谢奥利查尔斯沃思和科斯的答案,我把科斯的答案设置为解决方案,因为这是我最了解的一个。
原帖
当你在 Google 上搜索“ c + + 析构函数继承网站: stackoverflow.com”时,你会发现下面的帖子:
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)
问题2: 有谁认为这不是遗传的,请解释一下?
Q3: 那么当你用输入调用子类的构造函数时会发生什么呢?是否也调用了超类的“空构造函数”?