【发布时间】:2011-04-30 15:06:00
【问题描述】:
#include<iostream>
using namespace std;
class A
{
public:
int i;
A() {cout<<"A()"<<endl;}
~A() {cout<<"~A()"<<endl;}
};
class B:public A
{
public:
int j;
B(): j(10)
{
this->i=20;
this->~A();
}
};
int main()
{
B abc;
cout<<"i="<<abc.i<<" j="<<abc.j<<endl;
}//main
两个问题:
- 为什么 A 的析构函数会像普通函数一样被调用,而不是销毁对象? (或者只有当子类的析构函数调用基类的析构函数时,基类才会被销毁?)我正在尝试这个示例代码来了解析构函数是如何工作的。因此,如果简单地调用析构函数不会破坏对象,那么显然还有其他类型的调用会调用析构函数,然后才会破坏对象。这种电话有什么特别之处,又是什么电话?
-
有没有办法在 B 的构造函数中为 A 设置一个初始化列表?像这样的:
class B:public A { B(): j(10), A():i(20) {} };
【问题讨论】:
-
你能提供没有未定义行为的代码吗,无论明显的问题是什么?例如,没有显式析构函数调用的代码?
-
-1 不要编写愚蠢的代码(即在构造函数中破坏自己的基类)
-
this->~A();到底是为了什么?当然你should understand他们在你使用它们之前做了什么? :) -
@Jan 和@GMan:如果我在构建应用程序时使用相同的代码,那将是愚蠢的代码。在这里,我只是测试析构函数的工作以了解 C++ 的工作原理。我真正想知道的是析构函数是如何工作的。即:是否会调用析构函数来破坏对象。显然在这里,调用析构函数是不够的。其他事情发生在引擎盖下。我想知道那是什么。
-
@Armen:对象被销毁后使用。这本身就是UB。然后它被隐式析构函数调用第二次销毁(假设它发生在第一个 UB 中)。这也是UB。干杯,
标签: c++ inheritance destructor ctor-initializer