C++类继承详解:权限控制与继承方式解析
当然可以!下面是对这段 C++ 代码的逐行详细注释解释,帮助你理解类继承、访问控制(public
、protected
、private
)以及继承方式对成员权限的影响。
🧱 基类定义:Vehicle
cpp
深色版本
#include <iostream>
using namespace std;
引入标准输入输出库,并使用命名空间
std
,避免每次写std::cout
。
cpp
深色版本
// 基类,父类
class Vehicle { // 交通工具,车,抽象的概念
定义一个基类
Vehicle
,表示交通工具的基本属性和功能。
cpp
深色版本
public:string type; // 公有成员:类型string contry; // 国家string color; // 颜色double price; // 价格int numOfWheel; // 轮子数量
这些是
public
成员变量,外部可以直接访问。
cpp
深色版本
protected:int protectedData; // 受保护成员,只能在本类和派生类中访问,不能被外部访问
protected
成员对外不可见,但在派生类中可以访问。
cpp
深色版本
private:int privateData; // 私有成员,只能在本类内部访问,派生类也不能访问
private
成员是最严格的访问级别,即使是派生类也无法访问。
cpp
深色版本
public:void run() {cout << "车跑起来了" << endl;}
公有成员函数,用于模拟车辆运行。
cpp
深色版本
void stop();
函数声明,但未定义。如果调用会报链接错误。
cpp
深色版本
}; // 类定义结束
🧪 在类外定义 stop()
方法(虽然没实现)
cpp
深色版本
void Vehicle::stop() {// 实现内容省略
}
这里只是补充说明,实际上这个函数没有给出具体实现。
🔁 继承方式测试
1. 私有继承:TestClass
继承自 Vehicle
cpp
深色版本
class TestClass : private Vehicle {
使用私有继承,将
Vehicle
的所有公有和受保护成员都降级为private
。
cpp
深色版本
public:void testFunc() {price = 10; // 基类的公有数据被私有继承后,在派生类中变为私有,只限在类内部使用}
};
price
是基类的公有成员。- 私有继承后,它变成
TestClass
内部的私有成员。- 所以可以在
testFunc()
中访问。
cpp
深色版本
TestClass test;
test.price = 3.3; // 报错了,基类的公有成员被私有继承后,降为私有权限
❌ 错误:
- 外部无法访问
TestClass
的price
,因为它已经被降为私有权限。
2. 保护继承:Truck
继承自 Vehicle
cpp
深色版本
class Truck : protected Vehicle {
使用保护继承,将
Vehicle
的public
和protected
成员都变成protected
。
cpp
深色版本
public:void testFunc() {type = "数据测试"; // 原先是 public,现在变成 protected,可在派生类中访问protectedData = 10; // 原先是 protected,现在仍为 protected,可以访问privateData = 10; // ❌ 报错:基类的私有成员,不管哪种继承方式都无法访问}
};
type
是public
,在保护继承下变成protected
,可以访问。protectedData
是protected
,继承后仍是protected
,可以访问。privateData
是private
,无论何种继承方式,都不能访问。
cpp
深色版本
Truck t;
t.type = "测试"; // ❌ 报错:保护继承后,type 已经变成 protected,外部不能访问
t.protectedData = 10; // ❌ 报错:protected 成员不能在类外访问
3. 公有继承:Bickle
继承自 Vehicle
cpp
深色版本
class Bickle : public Vehicle {
公有继承保持基类成员的访问权限不变。
cpp
深色版本
public:void testFunc() {protectedData = 10; // 基类的 protected 成员在派生类中仍是 protected,可以访问}
};
protectedData
是protected
,继承后还是protected
,所以可以访问。- 如果尝试访问
privateData
,仍然无法访问。
4. 子类 Roadster
:公有继承自 Vehicle
cpp
深色版本
class Roadster : public Vehicle {
表示一种跑车,继承自
Vehicle
。
cpp
深色版本
public:int stateOfTop; // 新增成员,例如敞篷状态void openTopped(); // 敞篷方法void pdrifting(); // 漂移方法(可能拼写应为 drifting)
};
添加了新的成员变量和方法。
cpp
深色版本
int main()
{Roadster ftype;ftype.type = "捷豹Ftype"; // OK:type 是公有成员ftype.run(); // OK:run() 是公有函数Bickle bike;bike.type = "死飞"; // OK:type 是公有成员bike.run(); // OK:run() 是公有函数return 0;
}
ftype
和bike
都是从Vehicle
公有继承而来。- 所以它们都可以访问
type
和run()
。
📌 总结:不同继承方式对成员权限的影响
基类成员 | 公有继承 | 保护继承 | 私有继承 |
---|---|---|---|
public 成员 | 保持 public | 变成 protected | 变成 private |
protected 成员 | 保持 protected | 保持 protected | 变成 private |
private 成员 | 不可访问 | 不可访问 | 不可访问 |
✅ 输出说明
程序不会有任何输出,因为所有 cout
都被注释掉了或者没有实际打印语句。
但如果你添加如下语句:
cpp
深色版本
ftype.run(); // 输出:"车跑起来了"
你将看到输出结果。
🧠 小贴士
- 如果你想让某个成员在派生类中也能访问,请设为
protected
或public
。 private
成员无论怎样继承都不能被派生类访问。protected
成员在派生类中可以访问,但不能在类外访问。public
成员在派生类中依然可以访问,也可以在类外访问。
如果你还想继续扩展这个例子,比如:
- 添加虚函数实现多态;
- 使用抽象类;
- 或者重载运算符;
欢迎继续提问,我可以帮你完善 😊