C++ 使用非多态类进行动态向下转换,为什么';它不编译吗?
我有以下代码:C++ 使用非多态类进行动态向下转换,为什么';它不编译吗?,c++,class,dynamic-cast,downcast,C++,Class,Dynamic Cast,Downcast,我有以下代码: using namespace std; class BaseOk { public: virtual void ImplementMe() { }; }; class DerivedOk : public BaseOk { public: void ImplementMe() { } }; class CBase { }; class CDerived: public CBase { }; int main() {
using namespace std;
class BaseOk
{
public:
virtual void ImplementMe()
{
};
};
class DerivedOk : public BaseOk
{
public:
void ImplementMe()
{
}
};
class CBase { };
class CDerived: public CBase { };
int main()
{
CBase b; CBase* pb;
CDerived d; CDerived* pd;
pb = dynamic_cast<CBase*>(&d); // ok: derived-to-base
pd = dynamic_cast<CDerived*>(&b); // wrong: base-to-derived -> this doesn't compile
// Polymorphic case
BaseOk b2; BaseOk* pb2;
DerivedOk d2; DerivedOk* pd2;
pb2 = dynamic_cast<BaseOk*>(&d2); // ok: derived-to-base
pd2 = dynamic_cast<DerivedOk*>(&b2); // wrong: base-to-derived -> this returns a NULL pointer
}
使用名称空间std;
BaseOk类
{
公众:
虚拟void ImplementMe()
{
};
};
派生类OK:PublicBaseOK
{
公众:
void ImplementMe()
{
}
};
类CBase{};
类派生:公共CBase{};
int main()
{
CBase b;CBase*pb;
CDerived;CDerived*pd;
pb=dynamic_cast(&d);//确定:派生到基
pd=dynamic_cast(&b);//错误:从基到派生->这不编译
//多态性病例
BaseOk b2;BaseOk*pb2;
DerivedOk d2;DerivedOk*pd2;
pb2=dynamic_cast(&d2);//确定:派生到基
pd2=dynamic_cast(&b2);//错误:base to derived->返回空指针
}
带有指针“pd”的行执行向下转换,我同意它应该失败,因为结果是一个完全不同的对象。
我的问题是:为什么该行中的dynamic_cast根本不编译,而只是返回一个空指针
我正在使用MSVC2012编译器
为什么该行中的动态\u cast
根本不编译,而不是编译
只是返回一个空指针
将其视为功能/设施,而不是限制
dynamic\u cast
是一种基于指针/引用查找对象的RTTI(运行时类型信息)的机制。现在假设一个类根本不是多态的(即不包含任何
virtual
方法),那么dynamic\u cast
肯定会总是失败这意味着您不必在通过概率为0的情况下使用
动态\u cast
。为什么要在编译时已知的东西上浪费机器周期?这就是为什么编译器会立即为您提供该工具
这还有另一个隐藏的好处。假设您正在对引用使用dynamic\u cast
,如果失败,则会引发异常。有人想处理编译时已知的异常吗
为什么该行中的动态\u cast
根本不编译,而不是编译
只是返回一个空指针
将其视为功能/设施,而不是限制
dynamic\u cast
是一种基于指针/引用查找对象的RTTI(运行时类型信息)的机制。现在假设一个类根本不是多态的(即不包含任何
virtual
方法),那么dynamic\u cast
肯定会总是失败这意味着您不必在通过概率为0的情况下使用
动态\u cast
。为什么要在编译时已知的东西上浪费机器周期?这就是为什么编译器会立即为您提供该工具
这还有另一个隐藏的好处。假设您正在对引用使用
dynamic\u cast
,如果失败,则会引发异常。有人想处理编译时已知的异常吗 对指向非多态类型的指针使用动态\u cast
是错误的。这是一个可诊断的规则,因此您应该得到一个编译时错误
在指向不可转换为目标类型的多态类型的指针上使用它不是错误,并且在任何情况下,在编译时通常都无法检测到。它具有定义良好的行为,提供空指针。在指向非多态类型的指针上使用
动态\u cast
是错误的。这是一个可诊断的规则,因此您应该得到一个编译时错误
在指向不可转换为目标类型的多态类型的指针上使用它不是错误,并且在任何情况下,在编译时通常都无法检测到。它具有定义良好的行为,提供一个空指针。发布您得到的错误消息,dynamic\u cat假设RTTI信息,如果您有非多态类型,则没有任何RTTI(尝试使用dynamic\u cast int浮动,您将面临相同的问题)它在gcc 4.7上为我编译。请参阅您收到的错误消息的可能副本。dynamic_cat假设RTTI信息,如果您有非多态类型,则您没有任何RTTI(尝试使用dynamic_cast int浮动,您将面临相同的问题)它在gcc 4.7上为我编译。请看,在指向非多态类型的指针上使用动态强制转换的
可能的重复是一个错误。。。我认为“错误”在这种情况下是不恰当的词。这是一个微不足道的已知信息,它“总是错误的”;编译错误会通知用户。对指向非多态类型的指针使用动态强制转换是一个错误。
。。。我认为“错误”在这种情况下是不恰当的词。这是一个微不足道的已知信息,它“总是错误的”;它通过编译错误通知用户。