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

c++中的继承和多态

1. 继承

继承允许我们根据一个已有的类来定义一个新的类。已有的类称为基类,新定义的类称为派生类派生类继承了基类的特性和行为,并且可以添加自己新的特性和行为,或者修改继承而来的行为。

主要目的: 实现代码复用和建立类之间的层次关系(是一种“is-a”的关系)。

继承的基本语法:

cpp

class 派生类名 : 访问说明符 基类名 {// ... 派生类的新成员 ...
};

访问说明符可以是 publicprotected, 或 private。最常用的是 public 继承。

示例:
#include <iostream>
#include <string>
using namespace std;// 基类
class Animal {
public:string name;void eat() {cout << name << " is eating." << endl;}
};// 派生类 Dog 公有继承 Animal
class Dog : public Animal {
public:void bark() {cout << name << " says: Woof!" << endl; // name 是从 Animal 继承来的}
};// 派生类 Cat 公有继承 Animal
class Cat : public Animal {
public:void meow() {cout << name << " says: Meow!" << endl;}
};int main() {Dog myDog;myDog.name = "Buddy"; // 继承自 Animal 的成员myDog.eat();          // 继承自 Animal 的方法myDog.bark();         // 自己的方法Cat myCat;myCat.name = "Whiskers";myCat.eat();myCat.meow();return 0;
}

输出:

Buddy is eating.
Buddy says: Woof!
Whiskers is eating.
Whiskers says: Meow!

在这个例子中:

  • Dog 和 Cat 都是 Animal

  • 它们自动获得了 Animal 的 name 属性和 eat() 方法。

  • 它们还添加了自己特有的方法 bark() 和 meow()


2. 多态

多态的字面意思是“多种形态”。在C++中,它指的是当使用基类的指针或引用来调用一个虚函数时,程序会根据指针或引用所指向的实际对象的类型来决定调用哪个类的函数

主要目的: 实现接口的统一,让不同派生类的对象对同一消息做出不同的响应。

多态的实现依赖于两个关键技术:

  1. 虚函数: 在基类中使用 virtual 关键字声明的函数。

  2. 动态绑定: 函数调用在程序运行时(而不是编译时)才被解析。

多态的基本语法和示例:
#include <iostream>
#include <string>
using namespace std;// 基类
class Animal {
public:string name;// 关键:声明虚函数virtual void speak() {cout << name << " makes a sound." << endl;}// 虚析构函数(非常重要!)virtual ~Animal() {} 
};class Dog : public Animal {
public:// 重写基类的虚函数(override关键字是C++11引入的,确保正确重写)void speak() override {cout << name << " says: Woof!" << endl;}
};class Cat : public Animal {
public:void speak() override {cout << name << " says: Meow!" << endl;}
};// 一个通用的函数,接收基类的指针
void animalSays(Animal* animal) {animal->speak(); // 关键:这里调用哪个 speak() 取决于传入的实际对象
}int main() {Dog myDog;myDog.name = "Buddy";Cat myCat;myCat.name = "Whiskers";// 多态的魔力所在animalSays(&myDog); // 输出: Buddy says: Woof!animalSays(&myCat); // 输出: Whiskers says: Meow!// 另一种常见用法:基类指针数组Animal* animals[2] = {&myDog, &myCat};for (int i = 0; i < 2; ++i) {animals[i]->speak();}// 输出:// Buddy says: Woof!// Whiskers says: Meow!return 0;
}
多态的工作原理(简化的虚函数表):
  1. 当一个类包含虚函数时,编译器会为该类创建一个 虚函数表

  2. 这个表就像一个数组,里面存放着该类所有虚函数的地址。

  3. 每个该类的对象都会包含一个隐藏的指针(vptr),指向这个虚函数表。

  4. 当通过基类指针调用虚函数时,程序会通过对象的 vptr 找到对应的虚函数表,然后从表中查找并调用正确的函数版本。

重要注意事项:
  • 虚析构函数: 如果一个类可能被继承,并且可能会通过基类指针来删除派生类对象,那么基类的析构函数必须是虚函数。否则,只会调用基类的析构函数,而不会调用派生类的析构函数,导致资源泄漏。


文章转载自:

http://rEGFTATv.sjmxh.cn
http://S0wmh2m6.sjmxh.cn
http://LnmmVhDF.sjmxh.cn
http://QpevUmtz.sjmxh.cn
http://bbMqiagu.sjmxh.cn
http://uGUhtFfi.sjmxh.cn
http://FAMXaesz.sjmxh.cn
http://CrmfYABW.sjmxh.cn
http://OvzHuubP.sjmxh.cn
http://EpJPE7KF.sjmxh.cn
http://62Zg9ktR.sjmxh.cn
http://XtrkLhBQ.sjmxh.cn
http://5jCNctEe.sjmxh.cn
http://jXZ8P8nZ.sjmxh.cn
http://yq8CACkn.sjmxh.cn
http://RKV5OkL7.sjmxh.cn
http://3W3ISa7h.sjmxh.cn
http://rk8SdDYO.sjmxh.cn
http://MhaLaSC1.sjmxh.cn
http://vzmN0so0.sjmxh.cn
http://7b0v2pGY.sjmxh.cn
http://Vdm0olAe.sjmxh.cn
http://6ldzR3uF.sjmxh.cn
http://sP5z7B1W.sjmxh.cn
http://icsSdHGc.sjmxh.cn
http://pMDbysp4.sjmxh.cn
http://e1LKQmhk.sjmxh.cn
http://e7mPSR8z.sjmxh.cn
http://2u6EFroD.sjmxh.cn
http://qMaD0YEN.sjmxh.cn
http://www.dtcms.com/a/387970.html

相关文章:

  • GPTZero:在线AI内容检测工具
  • Ubuntu 磁盘扩容与扩容失败问题解决( df -h 与 GParted 显示空间不一致的问题 -LVM)
  • pytorch图像识别,入门深度学习第一个项目
  • Ubuntu 22.04 使用 Docker 部署 Redis 6.2(带密码与持久化)
  • Termux 安装 Trilium 笔记,全平台同步的好用开源 Markdow 笔记,超大型双链接笔记
  • CVAT工具的详细使用教程(视频标注)
  • 【一周AI资讯】Claude自动抓取网页;美团发布生活Agent;阿里通义发布双模型
  • [视图功能4] 视图共享与外部链接权限管理:安全又灵活的数据展示
  • 20250917在荣品RD-RK3588-MID开发板的Android13系统下使用tinyplay播放wav格式的音频
  • PAT 1013 Battle Over Cities
  • 自动驾驶车辆的网络安全威胁及防护技术
  • 《基于uni-app构建鸿蒙原生体验:HarmonyOS NEXT跨平台开发实战指南》
  • 数学_向量投影相关
  • 【完整源码+数据集+部署教程】传统韩文化元素分割系统: yolov8-seg-GFPN
  • hybrid实验
  • Prompt Engineering 技术文档
  • 《我看见的世界》- 李飞飞自传
  • TPS54302开关电源启动 1s 后输出电压掉电排查笔记 — TPS54302 5V→2.8V 案例
  • 具身智能数据采集方案,如何为机器人打造“数据燃料库”?
  • Prism模块化和对话服务
  • nas怎么提供给k8s容器使用
  • 【第五章:计算机视觉-项目实战之图像分类实战】1.经典卷积神经网络模型Backbone与图像-(8)多标签图像分类理论
  • 认知语义学中的意象图式对人工智能自然语言处理深层语义分析的影响与启示
  • [ffmpeg] 时间基总结
  • 数据结构排序入门(3):核心排序(归并排序,归并非递归排序,计数排序及排序扫尾复杂度分析)+八大排序源码汇总
  • 计算机网络七层模型理解
  • 同步与互斥学习笔记
  • 命令行方式部署OceanBase 集群部署
  • 小迪安全v2023学习笔记(八十四讲)——协议安全桌面应用hydra爆破未授权检测
  • MAC-简化版枚举工具类