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的析构函数

    评论

报告相同问题?

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?