私有继承提供的特性与包含相同:获得实现,并不获得接口。两者都可以用来实现has-a
的关系。
私有继承使用关键字private(实际上在继承中private是默认值,因此省略访问限定符也将导致私有继承)。
使用多个基类的继承被称为多重继承,例如:
class A{};
class B{};
class C : private A,private B{//多重继承
...
};
2. 保护继承保护继承是私有继承的变体。保护继承在列出基类的时候使用关键子protected;保护继承使得基类的公有成员和保护成员都将称为派生类的保护成员,其与私有继承一样,基类的接口在派生类中都是可用的,但是在继承层次结构之外是不可用的。两者的大区别在于派生类再派生出另外一个类的时候,使用私有继承第三代类将不能使用基类的接口,因为基类的公有方法在第二代类中变成了私有方法;但是在使用保护继承,第三代类可以使用基类的接口,因为在第二代类中基类的公有方法变成受保护的,因此在第三代类中可以使用它们。
公有继承、私有继承和保护继承的特点如下:
特征 | 公有继承 | 保护继承 | 私有继承 |
---|---|---|---|
基类的公有成员变成 | 派生类的公有成员 | 派生类的保护成员 | 派生类的私有成员 |
基类的保护成员变成 | 派生类的保护成员 | 派生类的保护成员 | 派生类的私有成员 |
基类的私有成员变成 | 只能通过基类的接口访问 | 只能通过基类接口访问 | 只能通过基类接口访问 |
能否隐式向上转换 | 是 | 是(但只能在派生类中) | 否 |
(注:这里的隐式向上转换只意味着无需进行显式类型转换,就可以将基类指针或引用指向派生类对象)
3. 使用using重新定义访问权限在使用私有派生和保护派生的时候,基类的公有成员函数将成为私有成员和保护成员。如果希望基类的方法能够在派生类外面可用的话,首先我们能想到的是在派生中定义一个公有方法,在该方法中调用基类的方法,进而实现该效果。另外一种方法就是使用using重新定义访问权限。
class Base{...
public:
double min();
double max();
...
};
class A:private Base{...
public:
using Base::min; //using只使用成员名,不需要圆括号、函数特征标和返回类型
using Base::max;
...
};
//调用
A a;
double min = a.min();
double max = a.max();
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧