2 hotyin hotyin 于 2014.10.16 00:47 提问

C++析构顺序,出乎意料

为什么下面析构时,b、a的析构函数没有被调用???
《深度探索C++对象模型》中讲过,先调用自己的析构函数,再调用成员变量的析构函数,最后调用父类的析构函数。
以下代码的输出,有点超乎我的理解范围,求解,求相助!
#include "stdafx.h"
#include
#include
using namespace std;

class A
{
public:
A()
{
puts("In A");
}
~A()
{
puts("Out A");
}
};

class B
{
public:
B()
{
puts("In B");
}
~B()
{
puts("Out B");
}
};

class X
{
public:
X()
{
puts("In X");
}
~X()
{
puts("Out X");
}
virtual void test()
{
puts("test in X");
}
};

class C:public X
{
public:
C(): b(), a()
{
puts("In C");
}
~C()
{
puts("Out C");
}
virtual void test()
{
puts("test in C");
}
private:
A a;
B b;
};

int main()
{
X* p = new C;
p->test();
delete p;
return 0;
}

2个回答

wangruitao1991
wangruitao1991   2014.10.16 17:42

因为你没有将X中的析构函数设为虚函数,所以delete p,将调用X的析构函数,而不是C的析构函数

I__gotit
I__gotit   2014.10.17 02:23

为什么下面析构时,b、a的析构函数没有被调用???
《深度探索C++对象模型》中讲过,先调用自己的析构函数,再调用成员变量的析构函数,最后调用父类的析构函数。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!