读书人

析构函数调用,该怎么解决

发布时间: 2012-06-07 15:05:14 作者: rapoo

析构函数调用
谁能帮忙详细解释一下以下问题
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
—)~C ~B


[解决办法]

C/C++ code
#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的析构函数调用呢
C/C++ code
#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即呆

读书人网 >C++

热点推荐