在C++的继承中,基类和派生类的指针,引用的题目我们都见的很多。前面我也总结过基类指针和派生类指针调用函数的机制。
将派生类引用或指针转换为基类引用或指针被称为向上强制转换(upcasting)即基类指针指向了派生类对象,或者将派生类对象强制转换成了基类指针指向了
class Base { public: int b; }; class Derive:public Base { public: int d; }; int main() { Base b; Derive d; Base *pb = &d;//向上强制转换 pb->b = 1; //可以赋值 cout << "Base::b = " << pb->b << endl; return 0; }
与向上强制转换相反,将基类指针或引用转换为派生类指针或引用成为向下强制转换。
如果不使用显示类型转换,向下强制转换是不允许的,因为is-a关系是不可逆的。
比如香蕉是水果,但是水果不是香蕉。
派生类香蕉可以新增数据成员,因此这些数据成员不能应用于基类水果,比如香蕉中有黄色,但是不是所有水果都是黄色的。
class Fruit { public: int weight; }; class Banana:public Fruit { public: int yellow; }; int main() { Fruit b; Banana d; Banana *pb = &b;//隐式向下强制转换 //报错 Banana *p = (Banana*)&b;//显式类型转换,不会报错 return 0; }