[C++ Primer Plus]第14章C++中的代码重用

私有继承

使用私有继承,基类的公有成员和保护成员都将成为派生类的私有成员。这意味着基类方法将不再成为派生类对象公有结构的一部分,但可以在派生类的成员函数中使用他们。

私有继承将对象作为一个未被命名的继承对象添加到类中。

//包含版本
//初始化列表进行对象初始化
Student(const char* str, const double* pd, int n):name(str),
    scorts(pd,n){}


double Student::Average()const{ 
    if(scores.size() > 0)
        return scores.sum()/scores.size();    
    else return 0;
}

//私有继承版本
//初始化列表进行对象初始化
Student(const char* str, const double* pd, int n):string(str),
    valarray(pd,n){}

double Student::Average()const{ 
    if(valarray::size() > 0)
        return valarray::sum()/valarray::size();    
    else return 0;
}
//访问基类对象
const string& Student::Name() const{
    return (const string&) *this;
}
//访问基类的友元函数
ostream & operator<<(ostream& os, const Student& stu){
    os<<(const string &) stu<<endl;
}
//运算符重载
double& Student::operator[](int i){
    return valarray::operator[](i);
}
//友元重载
istream& operator>>(istream& is, Student& stu){
    is>>(string&) stu;
    return is;
}

私有继承跟包含的优劣:

私有继承只能继承一次,如Student继承string类,那么Student内只能有一个string,如果需要两个string是无法实现的。私有继承需要重新定义虚函数。

而包含更加易于理解,也是大多数程序员所选择的。

保护继承

使用保护继承时,基类的公有成员和保护成员都将成为派生类的保护成员。

特征公有继承保护继承私有继承
公有成员变成派生类的公有成员派生类类保护成员派生类类的私有成员
保护成员变成派生类类保护成员派生类类保护成员派生类类私有成员
私有成员变成只能通过基类接口访问只能通过基类接口访问只能通过基类接口访问
能否隐式向上转换不能

多重继承

1、从两个不同的基类继承同名方法。2、从两个或更多相关基类那里继承同一个类的多个实例。

虚基类就是用来解决上面两个问题的。虚基类使从多个类派生出的对象只继承一个基类对象。通过在类声明中使用关键字virtual,可以使Worker被用作Singer和Waiter的虚基类

class Singer: virtual public Worker{};
class Waiter: virtual public Worker{};
class SingerWaiter: virtual public Singer, Waiter{};

SingerWaiter将只包含Worker对象的一个副本。C++在基类是虚的时候,禁止信息通告中间类自动传递给基类。

SingerWaiter::SingerWaiter(const Worker&wk, intp=0,int v=0):
    Worker(wk),Waiter(wk,p), Singer(wk,v){}

上述做法对于虚基类是合理的,但对于非虚基类,则是非法的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值