news 2026/9/3 7:23:33

【和春笋一起学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/8/29 18:45:52

CMSIS-RTOS在STM32上的移植完整示例

CMSIS-RTOS在STM32上的落地&#xff1a;不是封装&#xff0c;而是工程范式的重建 你有没有遇到过这样的场景&#xff1f; 调试一个电机PID任务时&#xff0c;UART中断频繁触发&#xff0c;导致控制周期抖动超过800μs&#xff1b; 客户突然要求把固件从FreeRTOS迁移到RT-Thre…

作者头像 李华
网站建设 2026/9/2 23:56:02

多模型统一访问:小白也能快速上手的API管理神器

多模型统一访问&#xff1a;小白也能快速上手的API管理神器 你是不是也遇到过这些情况&#xff1f; 想试试通义千问&#xff0c;得去阿里云申请Key&#xff1b;想调用文心一言&#xff0c;又得注册百度智能云&#xff1b;刚配好Claude的API&#xff0c;发现Gemini又要重新搞一…

作者头像 李华
网站建设 2026/9/2 23:32:31

DamoFD模型效果惊艳展示:低光照/侧脸/遮挡下稳定检测真实案例集

DamoFD模型效果惊艳展示&#xff1a;低光照/侧脸/遮挡下稳定检测真实案例集 你有没有遇到过这样的情况——在昏暗的楼道里拍合影&#xff0c;人脸几乎看不清&#xff1b;朋友侧着脸自拍&#xff0c;系统连眼睛都框不准&#xff1b;或者戴着口罩、墨镜、围巾&#xff0c;人脸识…

作者头像 李华
网站建设 2026/9/3 0:13:18

5分钟部署Qwen3-VL-8B:小白也能上手的视觉语言模型

5分钟部署Qwen3-VL-8B&#xff1a;小白也能上手的视觉语言模型 你是不是也试过在网页上上传一张图&#xff0c;输入“请描述这张图片”&#xff0c;几秒后就看到一段准确、流畅、带细节的中文描述&#xff1f;不是调用某个云API&#xff0c;也不是等服务器响应——而是你的电脑…

作者头像 李华
网站建设 2026/9/3 2:16:40

IAR软件中断函数编写操作指南:实战项目应用详解

IAR中断函数实战指南&#xff1a;从“点不亮LED”到工业级稳定运行 你有没有遇到过这样的场景&#xff1f; 按下开发板上的按键&#xff0c;预期触发一次中断、点亮一个LED&#xff0c;结果——什么都没发生。 或者更糟&#xff1a;系统偶尔死机、变量莫名被改写、调试器单步…

作者头像 李华
网站建设 2026/9/1 23:58:17

Open Interpreter金融建模实战:量化策略编写与回测

Open Interpreter金融建模实战&#xff1a;量化策略编写与回测 1. 什么是Open Interpreter&#xff1a;让自然语言真正驱动本地代码 你有没有过这样的经历&#xff1a;想快速验证一个股票择时想法&#xff0c;却卡在写pandas数据清洗的三行代码上&#xff1b;看到一篇研报里的…

作者头像 李华