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上为我编译。请看,在指向非多态类型的指针上使用动态强制转换的
可能的重复是一个错误。。。我认为“错误”在这种情况下是不恰当的词。这是一个微不足道的已知信息,它“总是错误的”;编译错误会通知用户。
对指向非多态类型的指针使用动态强制转换是一个错误。
。。。我认为“错误”在这种情况下是不恰当的词。这是一个微不足道的已知信息,它“总是错误的”;它通过编译错误通知用户。