向下强制类型转换
在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; }
运行结果如下:
在进行强制类型转换后一般需要判断强制转换是否成功,然后在接着执行进一步操作。