私有继承
使用私有继承,基类的公有成员和保护成员都将成为派生类的私有成员。这意味着基类方法将不再成为派生类对象公有结构的一部分,但可以在派生类的成员函数中使用他们。
私有继承将对象作为一个未被命名的继承对象添加到类中。
//包含版本
//初始化列表进行对象初始化
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){}
上述做法对于虚基类是合理的,但对于非虚基类,则是非法的。