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

C++继承详解

一、 继承的基本概念与语法

核心思想:将多个类共有的属性和行为提取出来,组成一个基类(父类)。其他类通过继承这个基类成为派生类(子类),从而实现代码复用。

#include <iostream> #include <string> using namespace std; // 基类 (父类) class Person { public: string name; int age; }; // 派生类 (子类) 继承 Person // 语法:class 派生类名 : 继承方式 基类名 class Student : public Person { public: int student_id; // 子类特有的属性 void study() { cout << name << " 正在学习。" << endl; } // 可以直接使用父类的 name }; class Teacher : public Person { public: string subject; void teach() { cout << name << " 正在教 " << subject << "。" << endl; } };

二、 继承方式与访问权限限制

继承方式决定了基类成员到达派生类后,访问权限会发生怎样的“降级”。关键点正如你所说:protected专为继承而生。

  • public成员:类内类外都能访问。

  • protected成员:类内、子类内可以访问,类外不能访问。

  • private成员:只有本类内可以访问,子类和类外都不能访问。(注:子类其实继承了父类的 private 数据,占据了内存,只是编译器不让你直接访问它)

继承方式基类 public 成员变成基类 protected 成员变成基类 private 成员变成
public继承public(保持不变)protected(保持不变)不可见 (无法直接访问)
protected继承protected(降级)protected(保持不变)不可见 (无法直接访问)
private继承private(降级)private(降级)不可见 (无法直接访问)

三、 构造函数与析构函数的执行顺序

核心法则:基类的构造和析构函数不能被继承

  • 构造顺序:先调用基类构造,再调用派生类构造。(先有父,后有子)

  • 析构顺序:先调用派生类析构,再调用基类析构。(白发人送黑发人)

#include <iostream> using namespace std; class Base { public: Base() { cout << "1. 基类 Base 构造函数" << endl; } ~Base() { cout << "4. 基类 Base 析构函数" << endl; } }; class Derived : public Base { public: Derived() { cout << "2. 派生类 Derived 构造函数" << endl; } ~Derived() { cout << "3. 派生类 Derived 析构函数" << endl; } }; int main() { cout << "--- 创建对象 ---" << endl; Derived d; cout << "--- 销毁对象 ---" << endl; return 0; }

四、 同名成员的处理 (隐藏机制)

当派生类和基类出现同名成员变量或同名成员函数时,派生类的成员会“隐藏”基类的同名成员

  • 访问派生类成员:直接点对象.成员

  • 访问基类被隐藏的成员:加上基类的作用域对象.基类名::成员

class BaseA { public: int num = 10; void print() { cout << "BaseA 的 print" << endl; } }; class DerivedA : public BaseA { public: int num = 20; // 同名成员变量 void print() { cout << "DerivedA 的 print" << endl; } // 同名成员函数 }; int main() { DerivedA obj; // 默认访问的是子类自己的 cout << "子类 num = " << obj.num << endl; obj.print(); // 强行访问父类被隐藏的成员 cout << "父类 num = " << obj.BaseA::num << endl; obj.BaseA::print(); return 0; }

五、 多继承与静态成员共享

1. 多继承语法:一个派生类可以同时继承多个基类,用逗号隔开。

2. 静态成员的继承:无论继承多少层,派生类多少个,基类的static静态成员在整个继承体系中只有唯一的一份内存。父子类共享它。

#include <iostream> using namespace std; class Father { public: static int family_wealth; // 静态成员声明 }; int Father::family_wealth = 10000; // 静态成员类外初始化 class Mother { public: int genes = 1; }; // 多继承语法 class Child : public Father, public Mother { public: void spendMoney() { family_wealth -= 100; // 子类直接花父类的钱 } }; int main() { Child c1; Child c2; c1.spendMoney(); // c1 改变了静态变量,c2 和 Father 看到的都会变,因为它们共享同一块内存 cout << "Father 的财富: " << Father::family_wealth << endl; // 9900 cout << "Child c2 看到的财富: " << c2.family_wealth << endl; // 9900 return 0; }
http://www.jsqmd.com/news/678122/

相关文章:

  • 告别密码输入:在Windows 11上为GitHub配置SSH密钥的完整指南
  • 2026年3月优质的粘钉一体机源头厂家推荐,半自动钉箱机/半自动粘箱机/全自动钉箱机/双片钉箱机,粘钉一体机工厂有哪些 - 品牌推荐师
  • AI教材写作神器来袭!低查重保障,快速生成25万字实用教材!
  • React 实战:从零构建一个支持拖拽与边界吸附的智能悬浮组件
  • 从流水灯到双机通信:手把手教你玩转51单片机串口(附代码与电路图)
  • 基于ROS2的多功能自主作业机器人设计与实现
  • 2026年宠物买卖品牌选型逻辑及TOP5合规机构盘点 - 优质品牌商家
  • 突破网盘限速的终极方案:LinkSwift 直链下载助手深度解析
  • YOLOv5至YOLOv12升级:车牌检测系统的设计与实现(完整代码+界面+数据集项目)
  • 别再裸跑容器了!1份经37家头部云厂商联合验证的Docker沙箱基线配置(含YAML/Ansible/Terraform三版本)
  • 终极全面战争模组制作指南:Rusted PackFile Manager (RPFM) 现代化解决方案
  • 揭秘AI教材生成低查重秘诀,利用AI写教材,3天完成30万字书稿!
  • 3分钟学会完整备份QQ空间说说:GetQzonehistory终极指南
  • NCM音频解密引擎:高性能分布式转换架构深度解析
  • 信奥之路-C++第11课作业
  • xrdp实战:构建企业级Linux远程桌面服务的3个关键决策
  • 企业级舆情监测系统技术解析:Infoseek数字公关AI中台架构与实践
  • YOLOv5至YOLOv12升级:常见车型识别系统的设计与实现(完整代码+界面+数据集项目)
  • 2026年4月深圳LED显示屏厂家综合实力深度解析与选购指南 - 2026年企业推荐榜
  • 数仓分层设计避坑指南:从DWD层粒度选择到ADS层指标爆炸,我的踩坑复盘
  • 构建之法阅读笔记05
  • 2026成都专业白蚁防治指南:技术合规与长效性解读 - 优质品牌商家
  • 2026年基于热力学原理的设备分类与工程选型:移动式冷风机、水冷式冷水机与蒸发式冷风机的技术对标分析 - 品牌推荐大师1
  • 魔兽争霸III必备神器:WarcraftHelper 增强插件完全指南
  • 品牌公关实战:Infoseek数字公关AI中台技术架构与舆情处置全流程解析
  • 别再死磕毕业论文!Paperxie 智能写作:大四生的「论文通关秘籍」
  • Visual C++运行库终极修复指南:3步解决Windows程序启动失败
  • 2026江苏主任护师考试红黑榜:哪家机构通过率真正靠谱? - 医考机构品牌测评专家
  • 别再折腾驱动了!手把手教你用MaixPy IDE连接K210开发板(附常见连接失败解决方案)
  • 别再死磕毕业论文了!Paperxie 这波操作,把本科写作的 “坑” 全填上了