我有一个名为EllipseContainer的向量,它是完整的(或将是)椭圆和圆圈。在本练习中,Circle
是Ellipse
的继承者,因此我想知道如何使用动态强制转换删除它们。
他们建议我使用它:
if (dynamic_cast<Circle*>(Ellipse[i]))
delete (Circle *)(Ellipse[i]);
但我真的不明白他们对Ellipse [i]的意思,你有什么线索吗?您是否看过有关dynamic_cast的内容以删除对象?
答案 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
的不变量会说它确实发生了变化。派生类不应该破坏其公共基础的不变量。