1. 继承的特征
特征 公有继承 保护继承 私有继承 公有成员变成 派生类的公有成员 派生类的保护成员 派生类的私有成员 保护成员变成 派生类的保护成员 派生类的保护成员 派生类的私有成员 私有成员变成 只能通过基类接口访问 只能通过基类接口访问 只能通过基类接口访问 能否隐式向上转换 是 是(但只能在派生类中) 否
2. 继承权限的用途
继承权限类型 作用 备注 公有继承 保护继承 也可以使用has-a关系 和私有继承主要区别是:私有继承无法将基类的公有成员和保护成员提供给下一个类继承,但保护的可以 私有继承 私有继承可以使用has-a关系,但同时也会引发很多问题,而且较为抽象不易理解,通常应使用包含来建立has-a关系;如果新类需要访问原有类的保护成员,或需要重新定义虚函数,则应使用私有继承 参考书籍:c++ primer plus(第六版)——14.2.2 使用包含还是私有继承
3. 继承权限的代码示例
私有继承
# include <iostream>
# include <valarray>
class CStudent : private std:: string , private std:: valarray < double >
{
public :
CStudent ( const std:: string & s, int n)
: std:: string ( s) , ArrayDb ( n) { }
const std:: string& Name ( ) const
{
return ( const std:: string& ) * this ;
}
friend std:: ostream& operator << ( std:: ostream& os, const CStudent& stu)
{
}
double Average ( ) const
{
if ( ArrayDb :: size ( ) > 0 )
return ArrayDb :: sum ( ) / ArrayDb :: size ( ) ;
else
return 0 ;
}
private :
typedef std:: valarray< double > ArrayDb;
} ;
int main ( )
{
CStudent stu ( "hello world" , 5 ) ;
std:: cin. get ( ) ;
return 0 ;
}
4. 使用using重新定义访问权限
使用保护派生或私有派生时,基类的公有成员将成为保护成员或私有成员。假设要让基类的方法在派生类外面可用:
方法一: 定义一个使用该基类方法的派生类方法。例如:
public :
double Student :: sum ( ) const
{
return std:: valarray < double > :: sum ( ) ;
}
方法二: 使用一个using 声明(就想名称空间那样)来指出派生类可以使用特定的基类成员,即使采用的是私有派生。例如:
class Student : private std:: string , private std:: valarray < double >
{
public :
using std:: valarray< double > :: min;
using std:: valarray< double > :: max;
}