保护继承不同于公有继承,声明派生类时使用关键字protected:
class Base
{
// ...基类成员和方法
};
class Derived: protected Base
{
// ..派生类成员和方法
};
保护继承和私有继承的类似之处是:
1. 它也是has-a 的关系;
2. 它也让派生类能够访问基类的所有公有成员;
3.就在继承层次结构外面,也不能通过派生类实例访问基类的公有成员;
随着继承层次结构的加深,保护继承与私有继承有些不同:
class Derived2 :protected Derived
{
///
};
在保护继承层次结构中,子类的子类(即Derived2)能够访问Based 类的公有成员,如下面程序所示;如果Derived 和Base 之间的继承关系是私有的,子类的类既不能访问基类的成员;
#include <iostream>
#include <string.h>
using namespace std;
class Motor
{
public:
void SwitchIgnition()
{
cout <<"Ignition ON "<< endl;
}
void PumFuel()
{
cout <<"Fuel in cylinders "<<endl;
}
void FireCylindes()
{
cout <<"Vroom" <<endl;
}
};
class Car: protected Motor
{
public:
void Move()
{
SwitchIgnition();
PumFuel();
FireCylindes();
}
};
class SuperCar: protected Car
{
public :
void move()
{
SwitchIgnition();
PumFuel();
//Motor
FireCylindes();
FireCylindes();
FireCylindes();
}
};
int main()
{
SuperCar myDreamCar;
myDreamCar.move();
return 0;
}
输出:
Ignition ON
Fuel in cylinders
Vroom
Vroom
Vroom
Car类以保护方式继承Motor 类,SuperCar 类以保护方式继承了Car,SuperCar::move()实现了基类motor 中定义的公有方法,能否经由在中间基类Car访问终极基类Motor 的公有成员呢,这取决与Car和Motor 之间的继承关系,如果继承关系是私有的。而不是保护的,Super将不能让访问基类Motor的公有成员,这与SuperCar和Car的继承关系没关系,将protected 改为private的 ,或public 都行。如:
class SuperCar: private Car
结果和之前的一样
Ignition ON
Fuel in cylinders
Vroom
Vroom
Vroom