基类构造析构函数、子类构造析构函数和子类成员变量构造析构函数的调用顺序

首先看一个问题:
分析下面这个程序析构函数的调用顺序。

class A  
{  
public:  
    A()  {     }  
    ~A() {    cout<<"~A"<<endl;   }  
};  

class B:public A  
{  
    public:  
        B(A &a):_a(a)  
        {  

        }  
        ~B()  
        {  
            cout<<"~B"<<endl;  
        }  
    private:  
        A _a;  
    };  

int main(void)  
 {  
        A a;       //很简单,定义a的时候调用了一次构造函数  
        B b(a); 
}

答案:
~B
~A
~A
~A
<

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 如果基类析构函数不是虚函数,它不会被其导出析构函数覆盖,导致在析构多态对象时不会调用导出析构函数。这可能会导致资源泄漏或其他错误。 举个例子,假设我们有一个基类 Shape 和它的导出 Circle。如果 Shape 的析构函数不是虚函数,那么当我们删除一个 Circle 型的对象时,它只会调用 Shape 的析构函数,而不是 Circle 的析构函数,因此 Circle 可能分配的任何资源都不会被正确释放。 因此,如果您有一个多态继承结构,请确保基类析构函数是虚函数。 ### 回答2: 基类析构函数不是虚函数,会带来以下几个问题: 1. 对象的内存泄露:当基类指针指向派生对象时,如果基类析构函数不是虚函数,那么当使用delete操作符删除这个基类指针时,只会调用基类析构函数,而不会调用派生析构函数。这样会导致派生对象的资源没有被正确释放,造成内存泄漏。 2. 对象切割:在基类指针指向派生对象的情况下,如果基类析构函数不是虚函数,那么当使用基类指针删除对象时,只会调用基类析构函数,而不会调用派生析构函数。这样会导致对象的派生部分没有得到正确的析构,可能导致资源泄露或行为异常。 3. 引发未定义行为:如果基类析构函数不是虚函数,且派生有带有资源占用的成员变量时,当使用基类指针删除派生对象时,派生析构函数将不会被调用。这样会导致派生对象的资源没有得到正确释放,可能造成程序行为的未定义。 综上所述,基类析构函数不是虚函数会导致对象的内存泄露、对象切割、以及引发未定义行为。为了避免这些问题,应该将基类析构函数声明为虚函数,以确保在删除对象时能够正确调用派生析构函数,从而正确释放资源。 ### 回答3: 基类析构函数不是虚函数会导致多态的对象销毁时不会调用派生析构函数,而只会调用基类析构函数。这可能会引发以下问题: 1. 对象不完全销毁:如果基类析构函数不是虚函数,则当我们使用基类指针指向派生对象时,通过基类指针删除该对象时,只会调用基类析构函数,而不会调用派生析构函数。这将导致派生对象的资源无法正确释放,可能会导致内存泄漏或资源泄漏。 2. 数据丢失:如果基类指针指向派生对象,并且我们将该指针赋值给派生对象的另一个派生指针,然后使用该派生指针删除对象,由于基类析构函数非虚,只会调用基类析构函数,不会调用派生析构函数。这将导致派生对象的成员数据无法正确释放,可能会导致数据丢失或程序行为异常。 3. 无法正确释放资源:在多态,我们通常通过基类指针来管理派生对象,当需要释放基类指针所指向的对象时,如果基类析构函数不是虚函数,只会调用基类析构函数,而不会调用派生析构函数。这将导致派生对象的资源无法正确释放,可能会导致资源泄漏或导致程序异常。 因此,为了避免上述问题,通常在基类析构函数应该声明为虚函数,以确保派生对象在销毁时能够正确调用派生析构函数,从而保证资源的正确释放和程序的正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vincentlmeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值