向下强制类型转换
在C++中,基类(父类)指针可以指向派生类(子类)对象,因为派生类对象也是一个基类对象(但反过来不一样,基类对象不是一个派生类对象)。然而基类指针只能调用基类的成员函数,如果试图使用该指针调用仅在派生类中含有的成员函数(子类特有的,不是继承和重写父类的函数),将会产生编译错误。为了避免这一错误,就必须将基类指针转换成为派生类指针。《C++大学教程第13章,面向对象编程:多态性》
如何进行向下强制类型转换
在C++使用 dynamic_cast 关键字进行向下强制类型转换,代码如下所示:
class Base{//基类
public:
Base(){}//构造函数
virtual void print()const{//虚函数print
cout << "父类的print函数"<< endl;
}
};
class A:public Base{//子类A
public:
A(){}//构造函数
virtual void print()const{//
cout << "子类A的print函数" << endl;
}
};
class B:public Base{//子类B
public:
B(){}//构造函数
virtual void print()const{//
cout << "子类B的print函数" << endl;
}
};
int main(){
Base *pbase = nullptr;
A a, *pa = nullptr;
B b, *pb = nullptr;
pbase = &a;//基类指针指向子类A对象
cout << "pbase是基类指针,但是指向的是子类A的对象" << endl;
pbase->print();//基类指针调用虚函数print,多态,将调用子类A的print
cout << endl <<"pbase是基类Base类型的指针\n" << "我们将其转换为子类A的指针:" ;
pa = dynamic_cast< A* >(pbase);
//向下强制类型转换,本来pbase指向的是子类A的对象,因此,该转换是成功的
if(nullptr != pa){
cout << "向下强制转换成功" << endl;
}else{
cout << "向下强制转换失败" << endl;
}
cout << "\n现在我们将其转换为子类B的指针:";
pb = dynamic_cast< B* >(pbase);
//此时pbase还是指向子类A的对象,我们让pbase强制转换成子类B的对象,转失败
if(nullptr != pb){
cout << "向下强制转换成功" << endl;
}else{
cout << "向下强制转换失败" << endl;
}
//pbase = &b;
// pbase->print();//调用子类B的print函数
return 0;
}
运行结果如下:
在进行强制类型转换后一般需要判断强制转换是否成功,然后在接着执行进一步操作。