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

C++动态多态原理分析

class Animal
{
public:void speak() {cout << "Animal.speak()" << endl;}
};class Cat :public Animal 
{void speak() {cout << "Cat.speak()" << endl;}
};
void doWork(Animal& animal) {animal.speak();
}void test01()
{Animal an;doWork(an);Cat cat;doWork(cat);
}

  doWork函数使用Animal类来接收子类执行speak(),理想状态下应该是接收什么类,就执行什么类的speak(多态),而实际情况是无论接收哪个子类的对象,都只会执行Animal.doWork(),原因是代码在编译阶段就完成了地址绑定(地址早绑定),Animal animal = cat就决定了animal.speak()是Animal类的speak而不是cat类的speak,而要实现理想效果就需要代码在运行阶段完成地址绑定(地址晚绑定)。解决办法是将父类的speak函数变为虚函数。

virtual void speak() {cout << "Animal.speak()" << endl;
}

在这一步后,Animal类中会多出一个名为vfptr的指针,意为虚函数表指针,其指向一个虚函数表,虚函数表内保存着虚函数的信息,借助cl工具可以查看表结构如下:

image

 而Cat类在继承Animal类后,与父类一样,同样也会有一个vfptr的指针,同样指向一个虚函数表,虚函数表内保存着父类虚函数的信息。(未对父类虚函数重写)

image

 而在子类重写父类的虚函数后,会在子类的vftable会将父类的虚函数覆盖,而父类的虚函数表不变。

image

 而此时doWork(cat)输出的就是Cat.speak()了

http://www.jsqmd.com/news/16151/

相关文章:

  • ENC28J60
  • 第七章 常见攻击事件分析--钓鱼邮件
  • 10月18日日记
  • 第九章-实战篇-运维杰克
  • 硬件基础知识
  • 第三章 权限维持-linux权限维持-隐藏
  • 第五章 linux实战-黑链
  • AI元人文:价值原语化——在创新与传承间搭建文明桥梁
  • 线段树历史值学习笔记
  • 连续两行fastq、连续两行MD5值如何转换为每行一个fastq一个MD5格式
  • bridge 一般是 网络桥接模块。
  • 周六训练-1018
  • 23-网关选型
  • (第五次)随机森林和xGboost
  • Asp.Net Core 解决使用 Docker调试时出现“准备容器时发生了一个非关键性错误。项目将继续正常工作。错误为: 路径中具有非法字符。”
  • [Linux] NeoVim安装和Lazyvim配置
  • ABC 随笔
  • 大数据分析基础及应用案例:第三周学习报告 ——Matplotlib 学习报告
  • 2025.10 训练日志
  • 全球AI推理扩展技术解析
  • 矩阵的秩和逆
  • 乱七八糟的知识点
  • 自监督学习在医疗AI中的技术搭建路径分析(下)
  • AtCoder Beginner Contest 428
  • swtich的应用
  • 2025/10/18
  • 模板机制作
  • P14253 旅行(trip)题解 - 符星珞
  • 因式分解
  • [Perl]install DateTime module