编辑:答案摘要 在下面,B是A的一个子类。 这是一个术语问题; 因为B 不能从A的接口借用,所以Ctors和dtors 不是inheritance的。 一个类至less有一个构造函数,并且只有一个析构函数。 构造函数 : B不从Ainheritance构造函数; 除非B的明确地呼叫A的Ctor 之一,否则A的默认Ctor会在 B的Ctor主体之前被自动调用(这个想法是A在B被创build之前需要被初始化)。 破坏者 : B不inheritanceA的dtor; B退出后,B的析构函数会自动调用A的析构函数。 致谢:特别要感谢Oli Charlesworth和Kos的回答,我把Kos的答案设定为解决scheme,因为这是我最理解的。 原来的post 当您在Google上search“C ++析构函数inheritance网站:stackoverflow.com”时,您当前find以下post: 构造函数和析构函数inheritance :具有30k +声望的两个用户说它是inheritance的,而不是 虚拟析构函数是inheritance的吗? :这里没有提到会指向不被inheritance的析构函数 C ++中的析构函数和inheritance? :评论似乎表明析构函数是inheritance的 Q1:我从实践中知道的是,如果不明确定义派生类的构造函数,就不能用相同的原型初始化派生对象,这是正确的吗? 即使从post中可以清楚地看到,析构函数似乎是被inheritance的,但是我仍然对这样一个事实感到困惑,那就是32k声誉的用户不会这么说。 我写了一个小例子来说明大家的想法: #include <cstdio> /******************************/ // Base class struct A { A() { printf( "\tInstance counter = %d (ctor)\n", ++instance_counter ); } ~A() { […]
在C ++中,下面的代码给出了一个编译器错误: void destruct1 (int * item) { item->~int(); } 这个代码几乎是一样的,我只是键入int到另一个types,并发生了一些奇迹: typedef int myint; void destruct2 (myint * item) { item->~myint(); } 为什么第二个代码有效? 一个int得到一个析构函数是因为它已被typedefed? 如果你想知道为什么有人想这样做:这是来自重构C ++代码。 我们正在删除标准堆,并用自制池replace它。 这要求我们调用placement-new和析构函数。 我知道为基元types调用析构函数是没用的,但是我们希望它们在代码中,以防我们用实际的类来replacePOD。 发现赤裸裸的int不工作,但typedefed的做是一个惊喜。 顺便说一句 – 我有一个涉及模板function的解决scheme。 我们只需在模板中inputdef,一切都很好。
在C ++中,如果构造函数抛出一个exception,什么析构函数运行? 特别是,如果在初始化列表或主体期间发生exception,它会有什么区别吗? 另外,inheritance和成员呢? 大概所有完成的build筑被破坏。 如果只有一些成员构build,只有那些被破坏? 如果有多重inheritance,那么所有完成的构造函数是否被破坏? 虚拟inheritance是否改变了什么?
VC ++使得在类声明内联函数中实现的函数成为可能。 如果我按如下方式声明Foo类,那么CONSTRUCTOR和DESTRUCTOR内联函数是什么? class Foo { int* p; public: Foo() { p = new char[0x00100000]; } ~Foo() { delete [] p; } }; { Foo f; (f); }
假设我们有一个(玩具)C ++类,如下所示: class Foo { public: Foo(); private: int t; }; 由于没有定义析构函数,因此C ++编译器应该为Foo类自动创build一个。 如果析构函数不需要清理任何dynamic分配的内存(也就是说,我们可以合理地依赖编译器给我们的析构函数),将会定义一个空的析构函数。 Foo::~Foo() { } 做与编译器生成的一样的东西? 什么是空的构造函数 – 也就是Foo::Foo() { } ? 如果有差异,它们在哪里存在? 如果没有,是一种比另一种更受欢迎的方法?