析构函数调用
谁能帮忙详细解释一下以下问题
class A
{
public:
~A(){};
};
class B
{
public:
~B(){};
};
class C: public A
{
public:
~C(){};
private:
static B b;
};
class D: public C
{
public:
~D(){};
};
int _tmain(int argc, _TCHAR* argv[])
{
C* pd = new D();
delete pd;
return 0;
}
以上程序段运行后,A、B、C、D四个类的析构调用先后顺序是()
(A)~D ~C ~B ~A
(B)~D ~C ~A ~B
(C)~C ~A ~B
(D)~C ~B
[解决办法]
#include <iostream>using namespace std;class A{public:~A(){cout<<"a"<<endl;};};class B{public:~B(){cout<<"b"<<endl;};};class C : public A{public:virtual ~C(){cout<<"c"<<endl;};private: B b;};class D : public C{public:virtual ~D(){cout<<"d"<<endl;};};int main(int argc,char* argv[]){C* pd = new D();delete pd;return 0;}
[解决办法]
楼主,我觉得这里面好像没有答案啊!因为你的B作为一个static申明后没有在外部定义,那么就不可能有构造。而你的每一个里面都写有B的析构,郁闷!
[解决办法]
我添加了 B C::b;
也不见B的析构函数调用呢
#include "stdafx.h"#include <stdlib.h>class A{public: ~A(){printf("A \n"); };};class B{public: ~B(){ printf("B \n"); };// B(int ){};}; class C : public A{public: ~C(){ printf("C \n"); }; static B b; static int ic;};int C::ic = 90;B C::b;class D : public C{public: ~D(){ printf("D \n"); };};int main(int argc, char* argv[]){ C* pd = new D(); delete pd; system("pause"); return 0;}
[解决办法]
c类中对象B未在类外定义,因此不会构造,最后的结果是~C ~A 构造出的对象D未析构,如果要析构D,父类析构函数声明为virtual即呆