之前的时候写过关于dynamic_cast相关的知识点,详见一前的文章:
C++ dynamic_cast运算符的使用
dynamic_cast:“XXX”不是多态类型
这次要说的是向下装换的问题,dynamic_cast可以转换指针和引用,前提是这个指针和引用必须要有继承关系,父类中必须要有虚函数。
class Base {
public:
virtual void showInfo() {
printf("这是基类\n");
}
};
class Product :public Base {
public:
void showInfo()override {
printf("这是子类\n");
}
private:
int num[10];
};
上面是两个类,一个父类,一个子类
以下是四种常用的方法:
Base createProduct() {
Product product;
return product;
}
//第一种
Base* baseA = new Product;
Product* productA = dynamic_cast<Product*>(baseA);
if (productA){
productA->showInfo();
}
//第二种
Product productB;
Base&baseB = dynamic_cast<Product&>(productB);
baseB.showInfo();
//第三种
Base baseD;
Product productD = dynamic_cast<Product&>(baseD);
productD.showInfo();
//第四种
Base&baseC = createProduct();
baseC.showInfo();
第一种和第二种分别是指针和引用可以正常的运行,都是生产了子类对象,然后通过父类指针或者引用来转换,这是没有问题的。
第三种是生产一个父类对象,然后通过子类对象来转换,这是不行的,编译的时候没有问题,但是运行的时候会报错:
第四种是通过一个函数返回一个父类对象,由于在函数中构造了一个子类对象,但是由于是局部变量,函数运行完成后就释放了,返回值就有自动创建一个父类对象,所以输出的内容任然是父类的内容。
这是父类
aaa