四十三、继承与派生:赋值兼容性规则

来源:互联网 发布:视频剪辑软件推荐 编辑:程序博客网 时间:2024/04/28 14:47
派生继承自基类,这样基类对象具有的功能,派生类对象也有。这样引出了赋值兼容性规则。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;
这样做有很多好处,比如对基类和派生类对象做相同操作,我们只要定义一个函数就可以了(其参数为基类对象或指针引用),提高了开发效率。需要注意的是:对于公有派生类对象代替基类对象使用,我们只能使用它从基类继承的成员,新成员明显是不能使用的。
#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::showBase::show*/
上面我们可以看到,虽然派生类对象地址赋值给了基类指针p,但明显p只访问到从基类继承的成员show(),不会调用到派生类的show函数。也就是说虽然派生类代替了基类对象,但也只能产生基类的功能,自己功能无法体现。
如果要在代替后同样实现自己功能,就要用到“多态性


0 0
原创粉丝点击