news 2026/4/23 12:14:16

【和春笋一起学C++】(五十九)派生类和基类之间的关系

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【和春笋一起学C++】(五十九)派生类和基类之间的关系

目录

使用派生类

派生类和基类之间的关系


使用派生类

要使用派生类,程序首先要能够访问基类声明,所以通常将基类声明和派生类声明放在同一个头文件中(也可以把它们放在不同的头文件中,但由于这两个类是相关的,因此通常把它们放在同一个头文件中),需要注意的是,在基类和派生类声明的头文件中,基类声明必须放在派生类声明的前面,否则编译时会报无法找到基类定义的错误。同理,基类和派生类的方法定义也通常放在一个.cpp文件中。

如《类继承》文章中的Student类和CulturalStudent类。

class Student { public: Student(string name_); Student(string name_, unsigned short yw, unsigned short sx, unsigned short yy); ~Student(); void scoreSet(int yuwen_score_, int shuxue_score_, int yingyu_score_); unsigned short get_yuwen_score() { return yuwen_score; } unsigned short get_shuxue_score() { return shuxue_score; } unsigned short get_yingyu_score() { return yingyu_score; } string get_name() { return name; } void show_score() { cout << "语文分数:" << yuwen_score << endl; cout << "数学分数:" << shuxue_score << endl; cout << "英语分数:" << yingyu_score << endl; } private: std::string name; unsigned short yuwen_score; unsigned short shuxue_score; unsigned short yingyu_score; }; class CulturalStudent:public Student { private: unsigned short lishi_score; unsigned short zhengzhi_score; public: CulturalStudent(string name_, unsigned short yw, unsigned short sx, unsigned short yy, unsigned short ls, unsigned short zz); CulturalStudent(const Student& st, unsigned short ls, unsigned short zz); unsigned short get_lishi_score() { return lishi_score; } unsigned short get_zhengzhi_score() { return zhengzhi_score; } void show_name_and_score(Student& st); };

派生类和基类之间的关系

  • 对于公有派生,派生类对象可以使用基类的方法。

例如:

CulturalStudent st1("xiaoming", 82, 82, 84, 90, 91); st1.get_shuxue_score();
  • 基类指针可以在不进行显式类型转换的情况下指向派生类对象;基类引用可以在不进行显式类型转换的情况下引用派生类对象。

例如:

CulturalStudent st1("xiaoming", 82, 82, 84, 90, 91); Student *st2 = &st1; Student &st3 = st1; st2->get_shuxue_score(); st3.get_shuxue_score();

通常,C++要求引用和指针类型与被赋给的类型匹配,但这一规则对继承来说是例外。不过,这种例外是单向的,不可以将基类对象和地址赋给派生类引用和指针。

基于这个规则,使用基类引用作为形参的函数可以用基类对象或派生类对象作为实参。

void CulturalStudent::show_name_and_score(Student& st) { cout << "name:" << st.get_name(); cout << " shuxue:" << st.get_shuxue_score(); }

上面的函数中,函数参数是基类引用,它可以指向基类对象或派生类对象,所以实参可以使用Student类对象或CulturalStudent类对象。以下调用都是可以的:

CulturalStudent st1("xiaoming", 82, 82, 84, 90, 91); Student *st2 = &st1; st1.show_name_and_score(*st2); st1.show_name_and_score(st1);

同理,对于形参为指向基类的指针的函数,也存在类似的关系,可以使用基类对象的地址或派生类对象的地址作为实参。

引用兼容性属性也能够将基类对象初始化为派生类对象。如:

CulturalStudent st1("xiaoming", 82, 82, 84, 90, 91); Student st5(st1);

初始化st5的过程如下:

Student st5(st1)匹配的构造函数原型为:Student(const CulturalStudent&),Student类中没有这样的构造函数,但存在隐式复制构造函数:Student(const Student&),形参是基类引用,因此可以引用派生类对象。将t5初始化为t1时,将复制t1对象中的name,yuwen_score,shuxue_score, yingyu_score成员值。具体的说,t5被初始化为嵌套在t1对象中的Student对象。

同样,也可以将派生类对象赋给基类对象,如下:

CulturalStudent st1("xiaoming", 82, 82, 84, 90, 91); Student st5("xiaohong", 90, 89, 78); st5 = st1;

此时,程序将调用基类的隐式重载赋值操作符函数:

Student& operator=(const Student&)const;

重载赋值操作符函数的形参是基类引用,因此,可以将派生类对象作为实参赋给它。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 21:05:46

LoRA训练助手完整指南:从图片描述到高质量tag落地全流程

LoRA训练助手完整指南&#xff1a;从图片描述到高质量tag落地全流程 1. 为什么你需要一个“会写tag”的AI助手&#xff1f; 你是不是也经历过这些时刻&#xff1a; 翻着几十页英文tag词典&#xff0c;却不确定“solo”和“front view”哪个该放前面&#xff1b;给一张穿旗袍…

作者头像 李华
网站建设 2026/4/19 13:35:59

Qwen3-ASR-0.6B惊艳案例:闽南语宗族口述史→方言转写+普通话意译对照表

Qwen3-ASR-0.6B惊艳案例&#xff1a;闽南语宗族口述史→方言转写普通话意译对照表 1. 这不是普通语音识别&#xff0c;是方言抢救式记录的新可能 你有没有听过老一辈用闽南语讲起家族迁徙的故事&#xff1f;那种带着海风咸味、夹杂古汉语遗存、语速快又带韵律的讲述&#xff…

作者头像 李华
网站建设 2026/4/18 0:58:12

高速PCB Layout电源完整性协同设计全面讲解

高速PCB Layout的电源交付路径&#xff1a;一场与瞬态电流的精密博弈你有没有遇到过这样的场景&#xff1f;一块刚贴片完成的AI加速卡&#xff0c;上电后逻辑分析仪抓不到有效波形&#xff1b;示波器在VCCINT测点看到一串200 MHz的周期性振铃&#xff0c;幅度高达80 mV&#xf…

作者头像 李华
网站建设 2026/4/23 12:10:09

KOOK真实幻想艺术馆部署案例:单卡3090跑通1024px Turbo推理

KOOK真实幻想艺术馆部署案例&#xff1a;单卡3090跑通1024px Turbo推理 1. 为什么这款AI艺术界面值得你花15分钟部署&#xff1f; 你有没有试过打开一个AI绘图工具&#xff0c;第一眼看到的却是密密麻麻的参数滑块、灰白界面和“Warning: CUDA out of memory”的红色弹窗&…

作者头像 李华
网站建设 2026/4/20 12:08:34

适用于课程实训的Multisim14.3安装详细教程

从课前崩溃到开箱即用&#xff1a;一位电子实验课教师踩过的Multisim 14.3安装深坑与实战解法 去年秋天&#xff0c;我站在讲台前&#xff0c;投影仪上还挂着“欢迎进入模电仿真实验”的PPT封面&#xff0c;而底下200台学生机——有三分之一正卡在“Initializing…”界面&#…

作者头像 李华
网站建设 2026/4/5 3:37:09

第9章 构建产品的行动蓝图:需求文档、原型与交互的实战指南

第9章 构建产品的行动蓝图:需求文档、原型与交互的实战指南 当商业前景已获认可(BRD),市场需求也已明晰(MRD)之后,产品经理的工作重心便从“论证做什么”转向了“定义怎么做”。产品需求文档(PRD)正是这一阶段的终极交付物,它是产品功能与体验的“宪法”,是开发团队…

作者头像 李华