C++中4种强制类型转换的区别总结

2020-01-06 15:58:57王冬梅

举例如下:


#include <iostream>
usingnamespace std;
 
class A 
{ 
public: 
 virtualvoid foo() 
 { 
 } 
}; 
 
class B 
{ 
public: 
 virtualvoid foo() 
 { 
 } 
}; 
 
class C : public A , public B 
{ 
public: 
 virtualvoid foo() { } 
}; 
 
void bar1(A *pa) 
{ 
 B *pc = dynamic_cast<B*>(pa); 
} 
 
void bar2(A *pa) 
{ 
 B *pc = static_cast<B*>(pa); //error
} 
 
void bar3() 
{ 
 C c; 
 A *pa = &c; 
 B *pb = static_cast<B*>(static_cast<C*>(pa)); 
} 
 
int main()
{
 return 0;
}

A、bar1无法通过编译

B、bar2无法通过编译

C、bar3无法通过编译

D、bar1可以正常运行,但是采用了错误的cast方法

解答:

选B。

dynamic_cast是在运行时遍历继承树,所以,在编译时不会报错。但是因为A和B没啥关系,所以运行时报错(所以A和D都是错误的)。

static_cast:编译器隐式执行的任何类型转换都可由它显示完成。其中对于:(1)基本类型。如可以将int转换为double(编译器会执行隐式转换),但是不能将int*用它转换到double*(没有此隐式转换)。(2)对于用户自定义类型,如果两个类无关,则会出错(所以B正确),如果存在继承关系,则可以在基类和派生类之间进行任何转型,在编译期间不会出错。所以bar3可以通过编译(C选项是错误的)。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。


注:相关教程知识阅读请移步到C++教程频道。