当独生子女类具有虚拟方法时使用多态性的问题

Issue with Using Polymorphism While Only Child Class has a Virtual Method

本文关键字:多态性 问题 方法 独生子女 虚拟      更新时间:2023-10-16

以下代码在任何方面都违反了C++11标准吗?我在VC++2013中得到了一个失败的断言。

class P {};
class C : public P
{
public:
    virtual void a() {}
};
int main()
{
    P* p = new C();
    delete p;
}

失败的断言是:

File: f:ddvctoolscrtcrtw32miscdbgdel.cpp
Line: 52
Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

是,

delete p;

具有Undefined Behavior,因为指针对象的动态类型与静态已知类型不同,后者没有虚拟析构函数。

C++11§5.3.5/3:

"在第一种选择中(删除对象),如果要删除的对象的静态类型与其动态类型,静态类型应为要删除的对象的动态类型的基类静态类型应该有一个虚拟析构函数,或者行为是未定义的