派生继承自基类,这样基类对象具有的功能,派生类对象也有。这样引出了赋值兼容性规则。Derived is a Base 类比Efective中的is-a章节赋值兼容性规则:在基类对象可以使用的地方都可以用公有派生类对象代替。class Base {…}; class Child:public Base {…}; Base base,*pBase; Child child;
根据上面规则,这里的代替有三种:
1、派生类对象赋值给基类对象。即派生类对象从基类继承成员的值分别赋值给基类对象的相应成员。
base=child;
2、派生类对象地址赋值给基类类型指针
pBase=&child
3、派生类对象初始化基类引用
Base &b=child;
这样做有很多好处,比如对基类和派生类对象做相同操作,我们只要定义一个函数就可以了(其参数为基类对象或指针引用),提高了开发效率。 需要注意的是:对于公有派生类对象代替基类对象使用,我们只能使用它从基类继承的成员,新成员明显是不能使用的。上面我们可以看到,虽然派生类对象地址赋值给了基类指针p,但明显p只访问到从基类继承的成员show(),不会调用到派生类的show函数。也就是说虽然派生类代替了基类对象,但也只能产生基类的功能,自己功能无法体现。#include<iostream> using namespace std; class Base { public: voidshow(){cout<<"Base::show"<<endl;} }; class Child0:public Base //公有继承 { public: voidshow(){cout<<"Child0::show"<<endl;} }; class Child1:public Base { public: voidshow(){cout<<"Child1::show"<<endl;} }; void CallShow(Base* pBase) //参数为基类指针,这样公有派生类对象和基类对象都可以调用,提高了效率 { pBase->show(); } int main() { Base*p; //声明基类指针 Child0c0; //公有派生类对象c0 p=&c0; //派生类对象地址赋值给基类指针 CallShow(p); Child1c1; //公有派生类对象c1 CallShow(&c1); //引用作为参数 return0; } /* 输出结果 Base::show Base::show */
如果要在代替后同样实现自己功能,就要用到“多态性”