向下强制类型转换
在C++中,基类(父类)指针可以指向派生类(子类)对象,因为派生类对象也是一个基类对象(但反过来不一样,基类对象不是一个派生类对象)。然而基类指针只能调用基类的成员函数,如果试图使用该指针调用仅在派生类中含有的成员函数(子类特有的,不是继承和重写父类的函数),将会产生编译错误。为了避免这一错误,就必须将基类指针转换成为派生类指针。《C++大学教程第13章,面向对象编程:多态性》
如何进行向下强制类型转换
在C++使用 dynamic_cast 关键字进行向下强制类型转换,代码如下所示:
1class Base{//基类 2public: 3 Base(){}//构造函数 4 virtual void print()const{//虚函数print 5 cout << "父类的print函数"<< endl; 6 } 7 8}; 9 10class A:public Base{//子类A 11public: 12 A(){}//构造函数 13 virtual void print()const{// 14 cout << "子类A的print函数" << endl; 15 } 16}; 17 18class B:public Base{//子类B 19public: 20 B(){}//构造函数 21 virtual void print()const{// 22 cout << "子类B的print函数" << endl; 23 } 24}; 25 26int main(){ 27 Base *pbase = nullptr; 28 A a, *pa = nullptr; 29 B b, *pb = nullptr; 30 31 pbase = &a;//基类指针指向子类A对象 32 cout << "pbase是基类指针,但是指向的是子类A的对象" << endl; 33 pbase->print();//基类指针调用虚函数print,多态,将调用子类A的print 34 35 cout << endl <<"pbase是基类Base类型的指针\n" << "我们将其转换为子类A的指针:" ; 36 pa = dynamic_cast< A* >(pbase); 37 //向下强制类型转换,本来pbase指向的是子类A的对象,因此,该转换是成功的 38 if(nullptr != pa){ 39 cout << "向下强制转换成功" << endl; 40 }else{ 41 cout << "向下强制转换失败" << endl; 42 } 43 44 cout << "\n现在我们将其转换为子类B的指针:"; 45 pb = dynamic_cast< B* >(pbase); 46 //此时pbase还是指向子类A的对象,我们让pbase强制转换成子类B的对象,转失败 47 if(nullptr != pb){ 48 cout << "向下强制转换成功" << endl; 49 }else{ 50 cout << "向下强制转换失败" << endl; 51 } 52 53 //pbase = &b; 54 // pbase->print();//调用子类B的print函数 55 56 return 0; 57}
运行结果如下:

在进行强制类型转换后一般需要判断强制转换是否成功,然后在接着执行进一步操作。