基类和派生类的析构函数
destructors of base and derived classes c++
我检查了这段代码,我看到在函数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
)。
必须通过引用或指针传递多态类型。
这被称为切片问题。
相关文章:
- 使用基类指针创建对象时,缺少派生类析构函数
- 添加自定义析构函数时,Move 构造函数在派生类中消失
- 从 c++ 中派生类的析构函数调用虚函数
- 如何从 Gtk::窗口调用派生对象的析构函数
- 在派生类中将公共父析构函数设为私有
- 即使基类和派生类只使用基元数据类型,我是否需要定义虚拟析构函数
- C++11:我可以显式调用基类析构函数来销毁派生类吗
- 在从仅移动类型派生的类中定义析构函数在使用 std::vector emplace_back或push_back创建时会
- 受保护的析构函数禁用在堆栈上创建派生类的对象?
- 防止派生析构函数中的 vtable 数据争用
- 如何在另一个类的向量中调用派生类的析构函数
- 了解派生类中C++析构函数的行为
- 私有派生析构函数
- 在派生类中重写哪个基类的虚拟析构函数
- 基类没有析构函数,但派生类有析构函数。我是否需要寻找与堆无关的任何陷阱?
- 显式声明派生类中所需的析构函数
- 调用派生类的析构函数
- 在这种情况下,我的派生类是否还需要一个虚拟析构函数
- g++对基类析构函数和派生类指针的未定义引用
- 通过 BaseClass List 调用派生类对象的析构函数