基类和派生类的析构函数

destructors of base and derived classes c++

本文关键字:析构函数 派生 基类      更新时间:2023-10-16

我检查了这段代码,我看到在函数func()的末尾基类的析构函数被调用了两次。我不明白为什么?谢谢你. .

class base  {
public:
    base(){cout << "ctor of basen";}
    ~base(){cout << "d-ctor of basen";}
};
class derived: public base 
{
public:
    derived(){cout << "ctor of derivedn";}
    ~derived(){cout << "d-ctor of derivedn";}
};
void func(base ob)
{
    cout << "inside funcn";
}
void main()
{
    derived ob; 
    func(ob);
    system("pause");
}

像这样重构基类:

class base  {
public:
    base(){cout << "ctor of basen";}
    base(const base&) {cout << "copy-ctor of basen";}
    ~base(){cout << "d-ctor of basen";}
};

将发出以下输出:

ctor of base
ctor of derived
copy-ctor of base
inside func
d-ctor of base
d-ctor of derived
d-ctor of base

很清楚地显示你的基本变量在func中被复制然后销毁。

base按值传递给func。这意味着将创建ob的切片副本。

这将被破坏以及ob本身。ob (derived::~derived)的析构函数将自动调用基类的析构函数。

因此base析构函数被调用两次。

调用函数时按值获取参数。因此,在func中创建一个base类型的局部变量。

当从func返回时,局部变量被销毁,因此调用ob的描述器(类型为base)。

必须通过引用或指针传递多态类型。

这被称为切片问题。