2.10.2 权限对继承的影响
在C++中,访问控制符对继承的影响可以通过下表来清晰地展示。这个表格展示了不同类型的继承(public
、protected
、private
)如何影响基类的不同类型成员(public
、protected
、private
)在派生类中的访问级别。
基类成员类型 | public 继承 | protected 继承 | private 继承 |
---|---|---|---|
public | public | protected | private |
protected | protected | protected | private |
private | 不可访问 | 不可访问 | 不可访问 |
解释:
public
继承:基类的public
成员在派生类中仍然是public
的,protected
成员仍然是protected
的。基类的private
成员在派生类中不可访问。protected
继承:基类的public
和protected
成员在派生类中都变成protected
的。基类的private
成员在派生类中不可访问。private
继承:基类的public
和protected
成员在派生类中都变成private
的。基类的private
成员在派生类中不可访问。
这个表格提供了一个快速参考,帮助理解在不同类型的继承中基类成员的访问级别是如何变化的。记住,无论继承类型如何,基类的 private
成员始终不可直接在派生类中访问。
访问权限回顾
访问权限 | 类内部 | 同一个类的对象 | 派生类(子类) | 类外部 |
---|---|---|---|---|
public | ✔️ 可访问 | ✔️ 可访问 | ✔️ 可访问 | ✔️ 可访问 |
private | ✔️ 可访问 | ❌ 不可访问 | ❌ 不可访问 | ❌ 不可访问 |
protected | ✔️ 可访问 | ❌ 不可访问 | ✔️ 可访问 | ❌ 不可访问 |
课程上写的验证代码
#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;
}