基类析构函数中虚函数调用的多态能力
Polymorph ability of virtual function called in destructor of base class
#include <iostream>
#include <map>
using namespace std;
class Base
{
public:
int m_nValue;
Base()
{
}
virtual ~Base()
{
Clear();
}
virtual void Clear()
{
cout << "Destroy Base." << endl;
}
};
class Derived: public Base
{
public:
Derived()
{
}
void Clear() override
{
cout << "Destory Derived." << endl;
}
};
int main()
{
Derived* d = new Derived();
delete d;
}
打印"摧毁基地"。我是c++新手,有人能告诉我为什么会这样吗?为什么不打印"销毁派生"。
当(就在)类型T
的构造函数体开始执行时,对象的动态类型调整为T
。
这意味着虚拟调用将像最初创建的类型为T
的对象一样解析。
这是一个相当昂贵的机制,所以它有一个非常重要的原因:为了避免调用派生类D
中的虚函数实现m
,其中D::m
的¹假设尚未建立。这样的向下调用是Java中常见的bug来源。这在c++中是不会发生的。
最后调用的构造函数体是最派生类的构造函数体,该类用于创建对象。这就是对象最终的动态类型
相反,当对象被销毁时,会发生相反的情况:一系列动态类型调整为更一般的类型。本质上,在类T
的析构函数体执行期间,对象的动态类型是T
。就像在执行T
构造函数体时一样。
<一口>
指出:
¹类T
的成员函数的上下文无关假设是T
对象状态的一般假设,例如其成员变量值之间的关系。这被称为T
的类不变量。因此,c++动态类型调整机制有助于确保只有构造函数和析构函数必须处理尚未完全建立的类不变式:在c++中(但例如在Java或c#中不是这样),所有其他成员函数都可以盲目地假设类不变式已经建立。一口>
相关文章:
- 多态性和功能结合
- 具有默认模板参数的多态类的模板推导失败
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 多态二进制函数
- 访问存储在向量C++中的结构的多态成员
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 将 std::allocate_shared 与多态资源分配器一起使用
- 通过switch和static_cast访问多态对象的运行时类型
- C++boost序列化多态性问题
- 多态杆件变量 - 类设计
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 如何在多线程中正确使用unique_ptr进行多态性?
- Doees the 'this' 指针参与虚函数的多态行为
- C++ 在堆栈中包含多态属性的类对象存储
- 基类和派生类的多态赋值运算符
- 转身多态对象
- 如何在基类指针向量的元素上应用重载的多态函数
- 具有智能指针的多态性
- 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成 null 指针?
- 基类析构函数中虚函数调用的多态能力