C ++中的new,delete和subclasses

|
TextItem
XObject
的子类。 我试图弄清楚为什么以下工作:
  TextItem *textItem = new TextItem();
  XObject *xItem = textItem;
  delete textItem;
但这不是:
  TextItem *textItem = new TextItem();
  XObject *xItem = textItem;
  delete xItem;
第二个示例在
delete
上失败,并带有断言失败(
_BLOCK_TYPE_IS_VALID
)。     
已邀请:
XObject *xItem = textItem;
delete xItem;
仅当ѭ1具有虚拟析构函数时,此方法才有效。否则,“ 4”语句将调用未定义的行为。
class XObject
{
    public:
       virtual ~XObject();
     //^^^^^^ this makes virtual destructor
};
    
确保
XObject
具有
virtual
析构函数,或者第二个片段具有未定义的行为:
struct XObject
{
    // now deleting derived classes
    // through this base class is okay
    virtual ~XObject() {}
};

struct TextItem : XObject {};
    
ѭ1不提供虚拟析构函数吗?如果没有虚拟析构函数,则通过基本指针删除ѭ0时会出现不确定的行为。     

要回复问题请先登录注册