c++ 面向对象的过程中, 包含和 私有继承都可以实现has-a的关系,下面我们来讨论一下啥时候用包含,啥时候用私有继承
包含和私有继承的关系
- 包含将对象作为一个命名的成员对象添加到类中,而私有集成将对象作为一个未被命名的继承对象添加到类中
- 我们称通过包含或者继承而来的对象为术语子对象(subobject)
- 私有继承提供的特性和包含相同
- 获得实现
- 不获得接口
构造函数初始化的不同
包含的类的写法
class Student{
private:
string name; //use a string object for name
valarray<double> scores; //use a val
}
私有继承的类的写法
class Student : private std::string,private std::valarray<double>{
public:
……
}
使用包含还是私有继承
由于既可以使用包含,也可以使用使用私有继承来建立has-a关系,那么我们应该使用哪一种方式呢?
答案是:包含
包含相对于继承的优点
- 包含比私有继承更好理解
- 继承会引起很多问题,尤其从多个基类继承时
- 包含能够包含多个同类的子对象,比如我可以包含三个
string
对象
包含相对于继承的缺点
- 私有继承能提供的特性比包含多
- 私有继承可以访问原来类的
protect
修饰的成员变量,而包含不可以 - 私有继承的派生类可以重新定义虚函数
总而言之:一般情况下应该使用包含实现has-a关系,如果新类需要访问原有类的保护函数,或需要重新定义虚函数,则应使用私有继承