如何进行动态破坏?

时间:2018-03-03 12:03:10

标签: c++

我有一个名为EllipseContainer的向量,它是完整的(或将是)椭圆和圆圈。在本练习中,CircleEllipse的继承者,因此我想知道如何使用动态强制转换删除它们。

他们建议我使用它:

if (dynamic_cast<Circle*>(Ellipse[i]))
    delete (Circle *)(Ellipse[i]);

但我真的不明白他们对Ellipse [i]的意思,你有什么线索吗?您是否看过有关dynamic_cast的内容以删除对象?

2 个答案:

答案 0 :(得分:2)

只有在基类中没有定义dynamic_cast析构函数的情况下,如果你有一个多态类层次结构(否则virtual不起作用),这种强制转换是必要的(如果你有一个virtual你可以破坏基类中的析构函数,甚至通过基类指针来推导实例。

这是非常不寻常的,因为一旦你的类是多态的,就没有理由没有虚拟析构函数(你已经为vtable付了代价) - 实际上,通常认为没有a的多态类层次结构是错误的虚拟析构函数。

长话短说,只要确保你的所有多态基类都运行虚拟析构函数,然后在没有特定强制转换的情况下执行delete(或者更好,让聪明的指针为你做delete )。

  

但我真的不明白他们对Ellipse [i]的意思,你有什么线索吗?

正如其他人所说,他们可能将Ellipse视为Ellipse *个对象的向量(尽管名称会与Ellipse类型名称冲突)。

答案 1 :(得分:1)

  

他们对Ellipse [i]

的意思

这可能是一个错误,因为如果Ellipse是一种类型,那就是格式错误。他们可能打算EllipseContainer[i],其中EllipseContainer可能是std::vector<Ellipse*>

此外,双重演员有点令人困惑。这会更简单:

delete dynamic_cast<Circle*>(EllipseContainer[i]);

请注意,如果EllipseContainer[i]没有指向Circle,则不会删除任何内容。

通常更好的设计是使基础虚拟的析构函数,因此不需要转换来删除基指针。

关于面向对象的设计:Ellipse可能是Circle的不良(公共)基础,因为这些类具有潜在冲突的不变量。例如,我们说Ellipse有函数set_x_radius()Ellipse的不变量表示调用函数不会更改get_y_radius()的值。但是,Circle的不变量会说它确实发生了变化。派生类不应该破坏其公共基础的不变量。