在C++中,访问控制符对继承的影响可以通过下表来清晰地展示。下图展示了不同类型的继承(public
、protected
、private
)如何影响基类的不同类型成员(public
、protected
、private
)在派生类中的访问级别。
解释:
•public 继承:基类的 public 成员在派生类中仍然是 public 的,protected 成员在派生类仍然是 protected 的。基类的 private 成员在派生类中不可访问。
•protected 继承:基类的 public 和 protected 成员在派生类中都变成 protected 的。基类的 private 成员在派生类中不可访问。
•private 继承:基类的 public 和 protected 成员在派生类中都变成 private 的。基类的 private 成员在派生类中不可访问。
下图提供了一个快速参考,帮助理解在不同类型的继承中基类成员的访问级别是如何变化的。记住,无论继承类型如何,基类的 private
成员始终不可直接在派生类中访问。
示例代码
#include <iostream>
using namespace std;
//基类,父类
class Vehicle{ //交通工具,车,抽象的概念
public:
string type;
string contry;
string color;
double price;
int numOfWheel;
protected:
int protectedData;
private:
int privateData;
public:
void run(){
cout << "车跑起来了" << endl;
}
void stop();
};
//私有继承测试
class TestClass : private Vehicle{
public:
void tsetFunc(){
price = 10; //基类的公有数据被私有继承后,在派生类中权限编程私有,只限在类内部使用
}
};
//公有继承测试
class Truck : protected Vehicle{
public:
void testFunc(){
type = "数据测试"; //编程了公有权限
protectedData = 10; //保持公有权限
privateData = 10; //报错了,基类的私有成员,不管哪种方式的继承都是不可访问的。
}
};
//公有继承,基类的公有权限和保护权限不变,私有成员不能访问
class Bickle : public Vehicle{
public:
void testFunc(){
protectedData = 10;
}
};
//派生类,子类
class Roadster : public Vehicle{ //跑车,也是抽象,比父类感觉上范围缩小了点
public:
int stateOfTop;
void openTopped();
void pdrifting();
};
int main()
{
TestClass test;
test.price = 3.3; //报错了,基类的公有成员被私有继承后,降为私有权限
Truck t;
t.type = "测试"; //报错了,基类的公有成员被保护继承后,降为保护权限
t.protectedData = 10; //从报错信息看出,保护继承造成基类的保护成员还是保持保护权限
Roadster ftype;
ftype.type = "捷豹Ftype";
ftype.run();
Bickle bike;
bike.type = "死飞";
bike.run();
return 0;
}