代码:
1 #include <cstdio> 2 #include <iostream> 3 4 using namespace std; 5 6 class A{ 7 public: 8 virtual void print(){ 9 cout<<"i am A"<<endl; 10 } 11 }; 12 13 class B:public A{ 14 public: 15 }; 16 17 int main(){ 18 19 A a; 20 B b; 21 A* pA = dynamic_cast<A*>(&b); 22 B* pB = dynamic_cast<B*>(&a);//会出现警告 23 cout<<pB<<endl; 24 pB = static_cast<B*>(&a); 25 cout<<pB<<endl; 26 pB->print(); 27 28 return 0; 29 }
输出:
0 0x7fff4f697300 i am A
分析:
dynamic_cast下行转换(基类到子类)时要求基类是多态的,如果发现下行转换不安全,dynamic_cast返回一个null指针;
static_cast则没有这个要求,但在无关类指针转换时,编译器会报错,提升了安全性。
时间: 2024-10-03 14:45:34