c++中的New、delete和子类
New, delete, and subclasses in C++
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;
只有当 XObject
有虚析构函数时,才有效。否则,delete
语句将调用未定义的行为。
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 {};
XObject
不提供虚析构函数吗?如果没有虚析构函数,则在通过基指针删除TextItem
时将得到未定义的行为。
相关文章:
- 继承期间显示未知行为的子类
- 通过指向指针数组的指针访问子类的属性
- 从父类方法返回子类对象
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 将父类对象强制转换为子类的问题
- 避免在C++中重复子类定义
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 如何初始化矢量的模板化子类
- C++ 继承:将子类传递给需要基类的函数并获取子类行为
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 使用子类覆盖基类中定义的函数
- 子类地址等于虚拟基类地址?
- 将子类方法声明为基类的友元
- C++子类共享变量?
- 如何检查模板专用化是否是基本模板的子类?
- 仅让特定类'Fabric'构造类'Foo'及其所有子类的实例
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 将复制构造函数超载与DELETE,然后调用C 子类的默认构造函数
- c++中的New、delete和子类