首页 > 编程语言 >C++:虚表指针、虚表、虚函数和动态多态

C++:虚表指针、虚表、虚函数和动态多态

时间:2024-05-29 17:11:04浏览次数:26  
标签:虚表 函数 show Derived 多态 C++ Base 指针

class Base {
public:
    virtual void show() { std::cout << "Base show" << std::endl; }
};

class Derived_1 : public Base {
public:
    void show() override { std::cout << "Derived show" << std::endl; }
};
class Derived_2: public Base {
public:
    void show() override { std::cout << "Derived show" << std::endl; }
};
Base *b = new Derived_1(); 
b->show(); Base *c = new Derived_2();
c->show();

 

分析上面代码,用基指针b指向Derived_1的实例化对象,然后使用b调用Derived的实例化对象重写的虚函数show(),同样的创建另外一个基指针调用DErived_2的实例化对象然后调用其重写的show()

那么有个问题,一样时基类Base的指针,它是怎么知道我此时该调用的是Derive_1中的show()还是Derive_2中的show()?

找一个"地图"用来查询,这个"地图"就放在Derived_1和Derived_2类的里面作为它们的成员之一,上面记录着他们各自内部所有的虚函数地址

当调用

b->show();

时,会访问Derived_1中的"地图",找到属于Derived_1的show()函数的地址,然后执行,c->show();同理。

这里的"地图"就是虚表,虚表是一个指针数组,里面存放着该类所有虚函数的地址。

显然,每个类都有自己不同的虚表,那基类指针b是如何得到对应不同的虚表?

当使用多态指针进行类的实例化时,就会"得到"地图,每个基类内都有个成员,称之为虚表指针

当执行

Base *b = new Derived_1(); 

时,b的虚表指针就会初始化为Derived_1实例化对象的虚表地址,或者说指向虚表,这样一来就可以通过虚表指针找到虚表,再进一步找到需要的虚函数

标签:虚表,函数,show,Derived,多态,C++,Base,指针
From: https://www.cnblogs.com/toriyung/p/18220704

相关文章

  • C++ 线程同步condition_variable的使用
    一,condition_variable使用步骤创建一个scondition_variable对象。创建一个互斥量对象mutex。创建两个线程:等待线程和唤醒线程。在等待线程中,使用unique_lock锁定互斥量,并调用wait函数进入等待状态。在唤醒线程lock_guard锁定互斥量,并调用notify_one或notify_all函数唤醒等......
  • C++ std::function和std::bind的六种用法总结
    一,使用funciton和bind的六种方法1,使用function接收普通函数2,使用function接收lambda函数3,使用function函数来接收函数对象4,使用bind函数绑定类中的一般函数5,使用bind函数绑定类中的多态函数6,使用function来实现回调。二,代码实现直接看代码和注释:#include<iostream>#......
  • C++语言实现身份证实名认证、身份证上的文字识别接口
    实名认证是什么意思呢?一般指的是对用户资料真实性进行的验证审核,这样有利于建立完善且可靠的互联网环境。如果交易双方使用的都是虚假信息,那么在诸多环节会存在很大的风险。另外,还有游戏平台对玩家进行实名认证,防止未成年人注册。翔云身份证实名认证接口,通过核验身份证二......
  • C++语言实现发票查验功能、医疗票据查验、财政票据识别
    封账结算是个苦活、累活,在账务干过的人都知道,就连发票都要一张一张的录,一张一张的审,结一次账、扒一层皮,就累得人仰马翻。除此之外,在临近春节的这个时期,账务部门的小伙伴们,只能眼巴巴地看着别人抢票,在财务报告初稿没有正式提交给审计师前,没人敢提前预定回家的票,甚至都不确定是......
  • Ubuntu下的onnxruntime(c++)编译 转载文章 非原创
    仓库下载gitclone--depth=1--branchv1.12.1https://github.com.cnpmjs.org/microsoft/onnxruntime.git注意:需要更换国内镜像源编译GPU./build.sh--skip_tests--use_cuda--configRelease--build_shared_lib--parallel--cuda_home/usr/local/cuda-11.3--cudnn_home/u......
  • C++中以类的成员函数作为Windows callback函数需要设置成static函数
    在看代码时,发现很多CALLBACK函数,所以仔细研究了一下C++中的CALLBACK函数首先,我们来理解一下,什么是C++中的CALLBACK函数 =>凡是由你设计,但是由Windows操作系统调用的函数,我们把它统称为CALLBACK函数,这些函数都有一定的类型,以方便配合Windows的调用动作某些WindowsAPI函数会要......
  • c++ 构造函数
     =================1.简介子类为完成基类初始化,在C++11之前,需要在初始化列表调用基类的构造函数,从而完成构造函数的传递。如果基类拥有多个构造函数,那么子类也需要实现多个与基类构造函数对应的构造函数。classBase{public: Base(intv):_value(v),_c(‘0’){} Base(cha......
  • QT C++实现表头添加组件
    QTableWidget在表头添加组件QTableWidget的表头有一个类QHeaderView是专门处理表头的类,要在表头添加一个类似QCheckBox的组件需要重写一个类并继承QHeaderView。QTableWidget中添加复选框并实现全选居中:自定义类MyHeaderView并继承QHeaderView自定义类MyTableWidget并继承QTa......
  • Java语言,MySQL数据库;SSM 心理咨询预约管理系统19086(免费领源码)计算机毕业设计项目推荐
    目 录摘要1绪论1.1背景及意义1.2研究现状1.3ssm框架介绍1.4论文结构与章节安排2 心理咨询预约管理系统系统分析2.1可行性分析2.1.1技术可行性分析2.1.2经济可行性分析2.1.3法律可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能......
  • 从 .NET 到 C++:集合处理的思考
    1.IEnumerable与List的比较在.NET中,IEnumerable和List是两种常用的集合类型,它们有各自的适用场景:IEnumerable<T>:优点:惰性求值,仅在迭代时计算,适用于大数据集或流式数据处理。缺点:不能进行索引访问,没有直接的添加或移除元素的方法。List<T>:优点:支持索引访问,具备......