类型兼容规则:在需要基类的任何地方,都可以使用公有派生类的对象来替代。通过公有继承,派生类得到了基类中除构造函数、析构函数之外的所有成员。这样,公有派生类实际就具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。
类型兼容规则中所指的替代包括以下的情况:
派生类的对象可以隐含转换为基类对象。
派生类的对象可以初始化基类的引用。
派生类的指针可以隐含转换为基类的指针。
在替代之后,派生类对象就可以作为基类的对象使用,但只能使用从基类继承的成员。
代码3中的new B()返回一个指向B对象的指针,之后隐式转换为指向A的指针a,因为a是指向A类对象的指针,因此可以用a来访问继承自A的类B的对象,但是a只能使用继承自A的成员。
根据赋值兼容规则,可以使用派生类的对象替代基类对象。如果用基类类型的指针指向派生类对象,就可以通过这个指针来访问对象,问题是访问到的只是从基类继承来的同名成员。解决这一问题的方法是:如果需要通过基类的指针指向派生类的对象,并访问某个与基类同名的成员,那么首先在基类中将这个同名函数说明为虚函数。这样,通过基类类型的指针,就可以使属于不同派生类的不同对象产生不同的行为,从而实现运行过程的多态。
将代码3稍作修改:
代码4:
#include<iostream> using namespace std; class A { public: virtual void print(){ cout<<"A print !"<<endl; } }; class B:public A { public: void print(){ cout<<"B print !"<<endl; } }; int main(){ A *a=new B(); a->print(); return 0; }