当前位置: 首页 > ops >正文

C++ 类继承

当然可以!既然你是 C++ 初学者,有 C 的基础,我们就用你能熟悉的方式来讲清楚 C++ 的 类继承(inheritance),再配一个简单易懂的例子。


🧠 什么是类继承?

类继承 是 C++ 的一个重要特性,让你可以基于一个“已有的类”(父类或基类)去“扩展”出新的类(子类或派生类),复用已有代码并添加新功能

你可以理解为:

子类 = 父类 + 自己的新东西


📦 通俗类比:

想象你有一个“交通工具”类(Vehicle):

  • 所有交通工具都有 品牌速度移动() 方法

你又想创建“汽车类”(Car)和“自行车类”(Bike),它们跟交通工具很像,但各自又有新特性,比如:

  • 汽车有油箱容量
  • 自行车有人力驱动方式

你没必要复制一份“品牌”、“速度”的代码,只要继承自交通工具就行。


📘 示例代码:通俗易懂的交通工具案例

#include <iostream>
using namespace std;// 父类(基类)
class Vehicle {
public:string brand;int speed;void move() {cout << brand << " 正在以 " << speed << " km/h 的速度移动。" << endl;}
};// 子类(派生类)
class Car : public Vehicle {
public:int fuel;  // 汽油量void showFuel() {cout << "当前油量是 " << fuel << " 升。" << endl;}
};int main() {Car myCar;myCar.brand = "Toyota";myCar.speed = 120;myCar.fuel = 40;myCar.move();      // 调用继承来的函数myCar.showFuel();  // 调用子类自己的函数return 0;
}

🔍 输出结果:

Toyota 正在以 120 km/h 的速度移动。
当前油量是 40 升。

🧩 学到了什么:

  • 子类 Car 继承了 Vehicle 的成员(brandspeedmove()
  • 子类可以添加自己的成员变量(如 fuel)和方法(如 showFuel()
  • 可以像用普通类一样使用继承后的类

🎓 小贴士(你需要知道的):

关键字作用
class A定义一个类 A
class B : public AB 是 A 的子类,继承 A 的 公共成员
public表示公开继承,是最常用的继承方式
protected子类能访问,外部不能访问
private子类和外部都不能访问

✅ 总结一句话:

继承 = 复用已有类的功能 + 扩展自己的新能力
它让你可以用“父类打基础,子类加功能”的方式组织代码,减少重复,提高可维护性。


你想接着学「多态(virtual 函数)」、「构造函数如何继承」、「私有继承和保护继承的区别」吗?还是先巩固基本继承?



太好了!那我们就一步一步升级学习 C++ 继承的更多特性。先从你现在的基础出发,我们继续讲讲:


✅ 1. 构造函数在继承中的工作方式

我们先继续用前面的交通工具例子。

🔧 子类如何构造父类的部分?

class Vehicle {
public:Vehicle(string b, int s) {brand = b;speed = s;}void move() {cout << brand << " 正在以 " << speed << " km/h 的速度移动。" << endl;}protected:string brand;int speed;
};class Car : public Vehicle {
public:Car(string b, int s, int f) : Vehicle(b, s) {fuel = f;}void showFuel() {cout << "当前油量是 " << fuel << " 升。" << endl;}private:int fuel;
};

📝 说明:

  • Car 的构造函数通过 : Vehicle(b, s) 先调用父类构造函数。
  • 这是必须的,因为父类 Vehicle 没有默认构造函数(自己写了带参数的)。

✅ 2. 多态:让父类指针/引用调用子类函数(virtual)

这是 C++ 的精髓之一!叫做 多态(polymorphism)


🌟 举个经典例子:

class Vehicle {
public:virtual void move() {  // 注意 virtualcout << "交通工具在移动。" << endl;}
};class Car : public Vehicle {
public:void move() override {  // 重写父类的 movecout << "汽车在公路上快速移动!" << endl;}
};

👇 使用:

int main() {Vehicle* v;      // 父类指针Car myCar;v = &myCar;v->move();  // 实际调用的是 Car 的 move()(多态)
}

✅ 输出:

汽车在公路上快速移动!

🧠 为什么要这样做?

你可以写很多子类(Car、Bike、Train…),但都统一用 Vehicle* 来管理它们。

✅ 多态 = 父类指针/引用调用子类的重写方法,前提是函数要加上 virtual


✅ 3. protected 访问权限

你已经熟悉 publicprivate,那 protected 是介于两者之间的访问权限:

  • protected子类可以访问,外部不可以访问
class Vehicle {
protected:string brand;
};class Car : public Vehicle {
public:void showBrand() {cout << "品牌是 " << brand << endl;  // ✅ 可以访问}
};int main() {Car c;// c.brand = "Toyota"; ❌ 错误:外部不能访问 protected
}

✅ 总结升级版:

特性说明
virtual实现多态:让子类函数替代父类函数调用
override明确声明是重写父类虚函数
protected子类可以访问,外部不行
构造函数初始化子类构造函数可通过 : Base(...) 初始化父类

✅ 推荐练习(可选):

你可以练习写一个小系统,例如:

  • 基类 Animalspeak() 方法
  • 派生类 DogCat 重写 speak()
  • 写一个 Animal* 的数组遍历并调用 speak(),体验多态

如果你需要我给你写这个完整的练习示例,或者加上文件分离(.h/.cpp)方式,我也可以继续帮你整理!继续吗?

http://www.xdnf.cn/news/13252.html

相关文章:

  • 《驭码CodeRider 2.0深度体验:AI驱动研发全流程革新,开发效率飙升300%!》
  • 实现建筑互联互通目标,楼宇自控系统在设备管理中作用凸显
  • 如何通过DNS解析实现负载均衡?有哪些优势?
  • DICOM批量修改工具
  • Pytest断言全解析:掌握测试验证的核心艺术
  • 15、企业固定资产(FA)全流程解析:从资产购置到资产处置
  • 产品经理入门到精通:01需求调研
  • 【Pandas】pandas DataFrame isna
  • 详解pytorch
  • 【学习笔记】虚函数+虚析构函数
  • 半导体设备基本通信标准介绍
  • shell脚本拔高习题
  • Word-- 制作论文三线表
  • SQL SERVER 数据库迁移的三种方法!
  • git clone 时报错超时的问题解决方案
  • 人工智能驱动的企业变革:从智能辅助到战略赋能
  • 【C#】C++的回调函数和C#的事件委托在某些方面有相似之处
  • 前端6月份之前的部分技术更新记录
  • mongDB
  • CentOS7.9 查询运维安全日志,排查恶意用户
  • 用C#实现单向链表和双向链表
  • 《滑动窗口》题集
  • 基于KubeSphere平台快速搭建单节点向量数据库Milvus
  • 【React-router-dom】浅拷贝,查询参数放到路由上
  • vue的这两个特性:数据驱动视图 与 双向数据绑定的区别
  • 工业环境的首选:试验台铁底板稳定性
  • 从设备监控到人员调度,可视化赋能车间全场景
  • 搭建一个springColud 项目,从头开始,里面有订单,库存两个模块
  • LangChain Chat History概念指南
  • 【ModelArts】ModelArts一站式AI开发平台详解(一)