基类和派生类的析构函数c ++

时间:2014-06-18 10:44:57

标签: c++ inheritance destructor

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

class base  {
public:
    base(){cout << "ctor of base\n";}
    ~base(){cout << "d-ctor of base\n";}
};
class derived: public base 
{
public:
    derived(){cout << "ctor of derived\n";}
    ~derived(){cout << "d-ctor of derived\n";}
};
void func(base ob)
{
    cout << "inside func\n";
}
void main()
{
    derived ob; 
    func(ob);

    system("pause");
}

3 个答案:

答案 0 :(得分:4)

重构您的基类,如下所示:

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

将发出以下输出:

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中的基本变量被复制然后被销毁。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:-1)

调用该函数时,您可以按值获取参数。因此,您在base中创建了func类型的局部变量。

当您从func返回时,本地变量会被销毁,因此会调用ob的descrutor(类型为base)。

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

这称为切片问题。有关详细信息,请参阅this链接。