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

派生继承自基类,这样基类对象具有的功能,派生类对象也有。这样引出了赋值兼容性规则。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::show
Base::show
*/
上面我们可以看到,虽然派生类对象地址赋值给了基类指针p,但明显p只访问到从基类继承的成员show(),不会调用到派生类的show函数。也就是说虽然派生类代替了基类对象,但也只能产生基类的功能,自己功能无法体现。
如果要在代替后同样实现自己功能,就要用到“多态性


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值