举例如下:
#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++教程频道。










