动态转换处理不相关的类型

M.C*_*M.C 9 c++ inheritance

#include <iostream> 
using namespace std; 
class X{ 
     public: 
     virtual void f(){} 
}; 

class Y { 
     public: 
     virtual void g() {} 
}; 

int main() 
{ 
     X * x = new X(); 
     Y* y = dynamic_cast<Y*>(x); //A 
     // Y* y = static_cast<Y*>(x);  //B 
     cout << y << endl; 
} 
Run Code Online (Sandbox Code Playgroud)

A编译而不编译B.我理解为什么B不编译,但为什么A编译虽然XY完全不相关的类型?

Ben*_*igt 22

这就是dynamic_cast不相关类型之间允许的原因:

class X{ 
     public: 
     virtual void f(){} 
}; 

class Y { 
     public: 
     virtual void g() {} 
};

class Z : public X, public Y {};

int main()
{ 
     X* x = new Z(); 
     Y* y = dynamic_cast<Y*>(x); // compiles and yields non-null pointer
} 
Run Code Online (Sandbox Code Playgroud)


mka*_*aes 5

动态强制转换使用运行时类型信息.所以这是合法的做这种情况但它会返回一个空指针.静态强制转换由编译器评估.


And*_*rey 1

编译器不在乎,因为它是dynamic_cast. yNULL在演员阵容之后。