dynamic_cast操作符是将以指向子类的父类指针转化为子类指针,或者将父类引用转化为子类引用。
区别在于对于指针,转化失败会返回0。而对于引用,因为不存在空引用(引用必须被初始化),如果转换失败则会返回一个bad_cast的异常
还有就是进行转化的指针必须具有多态,没多态也就不存在虚表,编译器无法进行判断。
#include<stdio.h>
#include<typeinfo>
using namespace std;
class A {
public:
A() {
printf("A\n");
}
virtual void p() {
printf("A_p\n");
}
};
class B :public A{
public:
B() {
printf("B\n");
}
virtual void p() {
printf("B_p\n");
}
};
int main() {
A *a = new B();
A *c = new A();
B z;
A &l = z;
A temp_a;
A &lp = temp_a;
if (B *b = dynamic_cast<B *>(a)) //指向子类的父类指针,转换成功
printf("yes_1\n");
if (B *b = dynamic_cast<B *>(c)) //指向父类的父类指针,转换失败返回0
printf("yes_2\n");
try {
B &p = dynamic_cast<B &>(l); //父类引用指向子类对象,转换成功
}catch (bad_cast) {
printf("bad_1\n");
}
try {
B &p = dynamic_cast<B &>(lp); //父类引用指向父类对象,转换失败
}
catch (bad_cast) {
printf("bad_1\n");
}
return 0;
}