私有继承:
在C++编程语言中,在声明一个派生类时将基类的继承方式指定为private的称为私有继承,用私有继承方式建立的派生类称为私有派生类(private derived class),其基类称为私有基类(private base class)。
私有基类的公用成员和保护成员在私有派生类中的访问属性相当于派生类中的私有成员,即派生类的成员函数能访问它们,而在派生类外不能访问它们。私有基类的私有成员在派生类中称为不可访问的成员,只有基类的成员函数可以引用它们,一个基类成员在基类中的访问属性和在私有派生类中的访问属性可能是不相同的。私有基类的成员在私有派生类中的访问属性见下表:
私有基类中的成员
在私有派生类中的访问属性
私有成员
公用成员
保护成员
不可访问
私有
私有
具体看下面的代码:
[cpp]
/*
*private_interitance.cpp
*Date : 2013-9-20
*Author: sjin
*Mail:413977243@qq.com
*/
#include <iostream>
using namespace std;
/*私有继承
*基类的public protected 成员都以private身份出现在派生类中,但是基类
*的private成员不可以访问。派生类的成员函数可以直接访问基类public protected
*成员,但是不能访问积累的privated成员,派生类的对象不能访问基类的任何成员
* */
/*基类:电动控制*/
class ElectricMotor{
public:
ElectricMotor(){};
virtual ~ElectricMotor(){};
public:
void StartMotor(){
Accelerate();
Cruise();
}
void StopMotor(){
cout << " Motor stopped" << endl;
}
private:
void Accelerate(){
cout << " Motor started" << endl;
}
void Cruise(){
cout << "Motor runnung at constant speed " << endl;
}
};
/*派生类*/
#if 0
class Fan : private ElectricMotor{
public:
Fan(){};
virtual ~Fan(){};
void StartFan(){
StartMotor();
}
void StopFan(){
StopMotor();
}
};
#else
/*私有继承和聚合(组合)
*
* */
class Fan {
public:
Fan(){};
virtual ~Fan(){};
void StartFan(){
m_ElectricMotor.StartMotor();
}
void StopFan(){
m_ElectricMotor.StopMotor();
}
private:
ElectricMotor m_ElectricMotor;
};
#endif
int main()
{
Fan mFan;
mFan.StartFan();
mFan.StopFan();
//mFan.Accelerate();
//ElectricMotor * pmoto = &mFan;
/*
private_inheritance.cpp: In function ‘int main()’:
private_inheritance.cpp:32: error: ‘void ElectricMotor::Accelerate()’ is private
private_inheritance.cpp:65: error: within this context
private_inheritance.cpp:65: error: ‘ElectricMotor’ is not an accessible base of ‘Fan’
private_inheritance.cpp:66: error:
*/
}
输出:
[plain]
Motor started
Motor runnung at constant speed
Motor stopped
在编译过程中中,如果main函数中最后2行注释去掉,会出现编译错误。具体错误信息主要违反了下面的原则:
基类的public protected 成员都以private身份出现在派生类中,但是基类的private成员不可以访问。派生类的成员函数可以直接访问基类public protected成员,但是不能访问积累的privated成员,派生类的对象不能访问基类的任何成员。
私有继承和聚合(组合)
[cpp]
class Fan {
public:
Fan(){};
virtual ~Fan(){};
void StartFan(){
m_ElectricMotor.StartMotor();
}
void StopFan(){
m_ElectricMotor.StopMotor();
}
private:
ElectricMotor m_ElectricMotor;
};
上面是对继承类的修改。将ElectricMotor 作为Fan的私有成员,而不是以私有方式从ElectricMotor 派生出Fan。这成为聚合或组合。
与使用私有继承相比,使用聚合的两一个不明显的优点是:消除了继承的层次节后,从而避免了“使用虚方法的代价”,进而可提高性能。
私有继承有以下几个优点:
1、派生类能够访问基类的保护成员函数;
2、 派生类可以覆盖基类的虚函数;
但这些优点相伴而来的是如下的代价 :
1、在多程序员编程中,代码的灵活性更低,更容易出错。
2、继承带来的性能问题。
因此,在可以使用聚合的情况下,应该避免使用私有继承。