编辑:答案摘要
下面,B 是 A 的子类。
这是一个术语问题;ctors 和 dtors不是继承的,因为 B 的 ctor/dtor不会从 A 的接口借用。一个类至少有一个构造函数,并且只有一个析构函数。
- 构造函数:
- B 不从 A 继承构造函数;
- 除非 B 的 ctor 显式调用A 的 ctor之一,否则来自 A 的默认 ctor 将在 B 的 ctor 主体之前自动调用(想法是 A 需要在 B 被创建之前被初始化)。
- 析构函数:
- B不继承A的dtor;
- 退出后,B的析构函数会自动调用A的析构函数。
致谢: 我要特别感谢 Oli Charlesworth 和 Kos 的回答,我将 Kos 的回答设置为解决方案,因为它是我最了解的一个。
原帖
当您在 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:那么当你调用带有输入的子类的构造函数时会发生什么?是否也调用了超类的“空构造函数”?