仅子类具有虚拟方法时使用多态性的问题

我提供

以下代码是否以任何方式违反C ++ 11标准?我在VC ++ 2013中收到失败的断言。

class P {};

class C : public P
{
public:
    virtual void a() {}
};

int main()
{
    P* p = new C();
    delete p;
}

失败的断言是:

File: f:\dd\vctools\crt\crtw32\misc\dbgdel.cpp
Line: 52

Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
干杯和hth。-阿尔夫

是的,

delete p;

由于指针的动态类型不同于静态已知的类型,并且静态对象没有虚拟析构函数,因此它具有未定义的行为。

C ++ 11§5.3.5/ 3:

在第一种选择(删除对象)中,如果要删除的对象的静态类型与它的动态类型不同,则静态类型应为要删除的对象的动态类型的基类,而静态类型应为具有虚拟析构函数或行为未定义

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章