【发布时间】:2010-10-25 08:34:30
【问题描述】:
我正在审查 C++ 强制转换运算符,但我有以下疑问:
对于多态类
- 我应该使用
polymorphic_cast - 我不应该使用
static_cast,因为向下转换可能会导致未定义的行为。无论如何,代码都会编译这种情况。
现在假设我有以下情况
class CBase{};
class CDerived : public CBase{};
int main( int argc, char** argv ){
CBase* p = new CDerived();
//.. do something
CDerived*pd = static_cast<CDerived*>( p );
}
由于不涉及多态性,我不会使用polymorphic_cast,代码甚至无法编译。
如果在某个时候,有人在继承树中引入了一些 virtual 函数,而我现在意识到了这一点,所以我处于危险之中:我该如何实现它?
我应该转到polymorphic_cast 以避免任何风险,但代码仍会在没有任何通知的情况下编译。
您如何意识到此类变化或防止此类情况发生?
谢谢 自动对焦
【问题讨论】:
-
代码甚至无法编译 - 你的意思是并且代码可以正常编译?
-
CBase 的析构函数不应该是
virtual吗?在这种情况下,您可以使用dynamic_cast或polymorphic_cast。 -
在标准 C++ 中没有
polymorphic_cast这样的东西。你为什么不首先使用CDerived?或者,如果您认为必须使用动态分配,为什么不使用CDerived*?即使您不知道虚拟功能也不会造成任何危险。类名上的所有这些“C”前缀是什么?对我来说,这听起来像是一个严重的口吃案例。干杯, -
:( 是的..我的意思是 dynamic_cast 不是 boost::polymorphic_cast。最后它是使用 dynamic_cast 实现的,不同之处在于如果 dynamic_cast 返回 0,则抛出 std::bad_cast。今天我需要几个更多的咖啡醒来。
-
P.S.我喜欢将 virtual 添加到析构函数作为每个类的起点并使用 dynamic_cast 的想法/建议