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

C++兼容性规则

一个公有派生类的对象在使用上可以被当作基类的对象,反之则禁止。具体表现在:

  1. 派生类的对象可以被赋值给基类对象。
  2. 派生类的对象可以初始化基类的引用。
  3. 指向基类的指针也可以指向派生类。

通过基类对象名、指针只能使用从基类继承的成员

举例:

1.派生类的对象可以被赋值给基类对象。这是一个总纲领,意味着在需要基类对象的地方,我们都可以用一个派生类对象来替代。

这会导致对象切片

#include <iostream>
#include <string>// 基类
class Person {
public:std::string name;void introduce() {std::cout << "我是一个人, 我的名字是 " << name << std::endl;}
};// 公有派生类
class Student : public Person {
public:int studentID; // 派生类特有的成员void study() { // 派生类特有的方法std::cout << name << " 正在学习, 学号是 " << studentID << std::endl;}
};int main() {Student stu;stu.name = "张三";stu.studentID = 101;Person per;per = stu; // 将派生类对象 stu 赋值给 基类对象 perstd::cout << "基类对象 per 的名字: " << per.name << std::endl;per.introduce();// per.studentID = 102; // 错误! per 是一个 Person 对象, 它没有 studentID 成员。// per.study();         // 错误! per 是一个 Person 对象, 它没有 study() 方法。
}

解释:
当执行 per = stu; 时,stu 对象中从 Person 继承来的部分(也就是 name 成员)被拷贝到了 per 对象中。stu 对象自己独有的成员(studentID)被完全“切掉”和丢弃了。因此,per 仍然是一个纯粹的 Person 对象,它只知道 name,不知道任何关于 studentID 或 study() 的信息。

2.派生类的对象可以初始化基类的引用。这是实现多态的一种非常安全和常见的方式,不会发生对象切片

#include <iostream>
#include <string>// 基类
class Person {
public:std::string name;void introduce() {std::cout << "我是一个人, 我的名字是 " << name << std::endl;}
};// 公有派生类
class Student : public Person {
public:int studentID; // 派生类特有的成员void study() { // 派生类特有的方法std::cout << name << " 正在学习, 学号是 " << studentID << std::endl;}
};int main() {Student stu;stu.name = "李四";stu.studentID = 102;// 使用派生类对象 stu 来初始化一个基类的引用Person& per_ref = stu;std::cout << "通过基类引用访问名字: " << per_ref.name << std::endl;per_ref.introduce(); // 调用的是 Person 的方法// per_ref.study(); // 错误! 虽然引用指向的是 Student 对象,但引用本身是 Person 类型,// 只能访问 Person 中定义的成员。
}

解释:
per_ref 是基类 Person 的一个引用,它直接绑定到了 stu 这个派生类对象上。内存中只有一个 stu 对象,没有发生任何拷贝。per_ref 成为了 stu 对象的一个“别名”,但这个别名是 Person 类型的,所以它有一个受限的“视野”。

3.指向基类的指针也可以指向派生类。这是实现多态最核心、最灵活的方式,同样不会发生对象切片

#include <iostream>
#include <string>// 基类
class Person {
public:std::string name;void introduce() {std::cout << "我是一个人, 我的名字是 " << name << std::endl;}
};// 公有派生类
class Student : public Person {
public:int studentID; // 派生类特有的成员void study() { // 派生类特有的方法std::cout << name << " 正在学习, 学号是 " << studentID << std::endl;}
};int main() {Student stu;stu.name = "王五";stu.studentID = 103;// 基类指针指向派生类对象Person* per_ptr = &stu;std::cout << "通过基类指针访问名字: " << per_ptr->name << std::endl;per_ptr->introduce(); // 调用的是 Person 的方法// per_ptr->study(); // 错误! 指针类型是 Person*,它“看”不到 Student 类中新增的成员。
}

解释:
`per_ptr` 是一个 `Person` 类型的指针,它存储了 `stu` 对象的内存地址。和引用一样,它也只是提供了一个基类“视角”来观察这个派生类对象。

http://www.dtcms.com/a/462300.html

相关文章:

  • 数据中台与数据生态:组织与平台的双轮驱动
  • 建站行业如何快速成第一单上海it公司有哪些
  • linux kernel v6.18 PCIe新增sysfs节点显示serial number
  • 音乐介绍网站怎么做天眼查网站建设公司
  • Quartz 定时 7 篇精选:从 32.768 kHz 到 100+ MHz(可视化与工具)
  • 苏州新区城乡建设网站怎么在百度上免费做广告
  • 开源金融数据平台的架构革命:OpenBB Platform深度技术解析
  • 西安买公司的网站建设荣耀手机品牌介绍
  • 树的遍历算法
  • 360做网站吗用哪个登录网址最好
  • nginx+springboot+redis+mysql+elfk
  • 基于springboot的在线商城系统设计与开发
  • Python自动化测试实战:深度解析Scripts脚本层结构!
  • 天津住房和城乡建设建造师网站与市场营销有关的网站
  • 系统移植篇之uboot-2:编译微观实验
  • 第一章 网络基础
  • 建筑网站起名东道设计公司logo
  • LC175 组合两个表
  • 个人怎么注册网站网站301跳转
  • MongoDB 集合更新后通过 Socket.IO 自动推送数据到前端 (FastAPI 实现)
  • 东胜网站建设医疗网站前置审批查询
  • windows如何设置mongodb的副本集
  • 物流网站有哪些网站被做301跳转了怎么办
  • shell脚本命令删除Zookeeper提供者服务中的指定IP节点
  • 六安网站制作公司价格龙口网络
  • Node.js使用Express框架解决中文乱码问题
  • 设计模式--桥接模式:解耦抽象与实现的灵活设计
  • 做竞价的网站怎么做网站数据库备份
  • 基于FireBeetle 2 ESP32-C5的智能植物光照系统——物联网农业实践
  • 天津住房与城乡建设厅网站首页包头学做网站