soloproc 2014-10-15 16:47 采纳率: 0%
浏览 2448

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条回答 默认 最新

  • todd-wong 2014-10-16 09:42
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥35 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站