C++编程语言中,在声明一个派生类时将基类的继承方式指定为private的称为私有继承,用私有继承方式建立的派生类称为私有派生类(private derived class),其基类称为私有基类(private base class)。
如果两个类之间的继承关系为私有或者保护,编译器一般不会将派生类对象转换成基类对象。从私有基类继承而来的成员成为派生类的私有成员,即使它们在基类中是保护或公有成员。
私有基类的公用成员和保护成员在私有派生类中的访问属性相当于派生类中的私有成员,即派生类的成员函数能访问它们,而在派生类外不能访问它们。私有基类的私有成员在派生类中称为不可访问的成员,只有基类的成员函数可以引用它们,一个基类成员在基类中的访问属性和在私有派生类中的访问属性可能是不相同的。私有基类的成员在私有派生类中的访问属性见下表:
私有基类中的成员 | 在私有派生类中的访问属性 |
私有成员 | 不可访问 |
公有成员 | 私有 |
保护成员 | 私有 |
私有继承和组合的相同点和不同点是什么?如何在两者之间作出选择?
使用组合表示 "(has a)" (即有一个) 的关系。如果在组合中需要使用对象的某些方法,则完全可以利用私有继承代替。
私有继承使派生类获得基类的一份备份,同时可以访问基类的公共以及保护接口以及重写基类虚函数。它意味着 " Is Implement In Terms Of "(即以...实现),它是组合语法上的一种变形(即聚合或者" 有一个")。
答案: 相同点是都是表示" has a" 关系。 不同点是私有继承中派生类可以访问基类的保护、公有成员,并且可以重写基类的虚函数(甚至当基类是抽象类时),组合不具有这些功能。 选择它们的原则为尽可能使用组合,万不得已时使用私有继承。