java怎么调用析构函数_我是否需要显式调用基本虚拟析构函数?

当用C ++覆盖一个类(使用虚拟析构函数)时,我在继承类上再次将析构函数实现为虚拟,但是我是否需要调用基本析构函数?

如果是这样,我想它就是这样......

MyChildClass::~MyChildClass() // virtual in header

{

// Call to base destructor...

this->MyBaseClass::~MyBaseClass();

// Some destructing specific to MyChildClass

}

我对吗?

#1楼

不,你永远不会调用基类析构函数,它总是像其他人指出的那样自动调用,但这里是结果的概念证明:

class base {

public:

base() { cout << __FUNCTION__ << endl; }

~base() { cout << __FUNCTION__ << endl; }

};

class derived : public base {

public:

derived() { cout << __FUNCTION__ << endl; }

~derived() { cout << __FUNCTION__ << endl; } // adding call to base::~base() here results in double call to base destructor

};

int main()

{

cout << "case 1, declared as local variable on stack" << endl << endl;

{

derived d1;

}

cout << endl << endl;

cout << "case 2, created using new, assigned to derive class" << endl << endl;

derived * d2 = new derived;

delete d2;

cout << endl << endl;

cout << "case 3, created with new, assigned to base class" << endl << endl;

base * d3 = new derived;

delete d3;

cout << endl;

return 0;

}

输出是:

case 1, declared as local variable on stack

base::base

derived::derived

derived::~derived

base::~base

case 2, created using new, assigned to derive class

base::base

derived::derived

derived::~derived

base::~base

case 3, created with new, assigned to base class

base::base

derived::derived

base::~base

Press any key to continue . . .

如果将基类析构函数设置为虚拟的,那么案例3的结果将与案例1和2相同。

#2楼

不,您不需要调用基础析构函数,派生析构函数总是为您调用基础析构函数。 请在此处查看我的相关答案以了解销毁顺序 。

要了解为什么要在基类中使用虚拟析构函数,请参阅以下代码:

class B

{

public:

virtual ~B()

{

cout<

}

};

class D : public B

{

public:

virtual ~D()

{

cout<

}

};

当你这样做时:

B *pD = new D();

delete pD;

然后,如果B中没有虚拟析构函数,则只调用~B()。 但是因为你有一个虚拟的析构函数,所以先调用~D()然后调用~B()。

#3楼

不,它是自动调用的。

#4楼

不,析构函数会按照相反的构造顺序自动调用。 (基础课最后)。 不要调用基类析构函数。

#5楼

其他人说了什么,但也注意到你不必在派生类中声明析构函数virtual。 一旦声明了析构函数virtual,就像在基类中那样,所有派生的析构函数都是虚拟的,无论你是否声明它们。 换一种说法:

struct A {

virtual ~A() {}

};

struct B : public A {

virtual ~B() {} // this is virtual

};

struct C : public A {

~C() {} // this is virtual too

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值