首页 > 编程语言 >C++继承模型漫谈

C++继承模型漫谈

时间:2022-10-11 20:48:28浏览次数:52  
标签:虚表 模型 漫谈 TypeA C++ TypeB public v2 void

1、创建子类对象时,会优先创建父类部分,再创建子类部分,也就是子类对象是包含了两部分内容,(父类部分+子类部分)(图1)

class TypeA {
public:
    int a = 10;
    void v() {}
};
class TypeB:public TypeA {                      
public:
    int b = 20;
    void x() {}
图1

图2

 

 

 现在把obj_b地址赋值给TypeA类型的指针ptr_a,那么ptr_a认为其指向的就是TypeA对象,而且不会有任何问题,毕竟obj_b对象的前半部分就是来自TypeA类型(图2)

2、如果类型中含有虚函数,那么就会多出虚函数表(简称虚表)vftable,虚函数表中保存虚函数的指针,编译器生成一个虚表指针变量vfptr,指向该虚表(图3)

class TypeA {
public:
    int a = 10;
    void virtual v() {}
    void virtual v2() {}
};
class TypeB:public TypeA {
public:
    int b = 20; 
    void virtual x() {}
    void virtual v2() {}
};

 

图3

 

 有两张虚表,一张是TypeA类型的,一张是TypeB类型的。TypeA有两个虚函数,所以虚表中也有2个虚函数指针。TypeB的虚表中有3个虚函数,一个继承了TypeA的函数(TypeA::v),一个重新定义了TypeA的函数(TypeB::v2)

还一个是自己本身自带的函数(TypeB::v2)。

这里我们看到vfptr只有一个,这个是类型TypeA的,TypeB直接继承来用。vfptr是在构造函数中初始化的(这个是由编译器自动生成,程序员不知道),所以其实当我们创建b_obj对象时,会赋值两次。

第一次是在调用TypeA构造函数时赋值(赋值的是TypeA虚表),第二次是在TypeB构造函数中赋值(赋值的是TypeB虚表),第二次把第一次的覆盖了。

执行a_ptr->v()  从虚拟表冲找到TypeA::v执行,执行a_ptr->v2() 从虚拟表冲找到TypeB::v2执行。

 

标签:虚表,模型,漫谈,TypeA,C++,TypeB,public,v2,void
From: https://www.cnblogs.com/fuyun2000/p/16782462.html

相关文章

  • <三>从编译器角度理解C++代码的编译和链接原理
    代码点击查看代码**sum.cpp**intgdata=10;intsum(inta,intb){returna+b;}**main.cpp**externintgdata;intsum(int,int);intdata=20;intmain(......
  • Thread专题(13) - java存储模型
    此文被笔者收录在系列文章​​​架构师必备(系列)​​中存储模型java语言规范规定了JVM要维护内部线程类似顺序化语意,只要程序的最终结果等同于它在严格的顺序环境中执行的......
  • 基于三维模型的目标识别和分割在杂乱的场景中的应用
    在杂波和遮挡情况下,对自由形式物体的识别及分割是一项具有挑战性的任务。本文提出了一种新的基于三维模型的算法,该算法可以有效地执行该任务,对象的三维模型是从其多个无序范......
  • 【预测模型-BP分类】基于布谷鸟算法优化BP神经网络实现数据分类附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • C++中class关键字
    在C++语言中​​class​​​是定义类的关键字,C++中也可以使用struct定义类。两者区别是,用​​class​​​定义的类,如果​​数据成员​​​或成员函数没有说明则默认为priva......
  • windows C++ 异常调用栈简析
    楔子以win11+vs2022运行VC++编译观察的结果。如果安装了VisualStudio2022,比如安装在D盘,则路径:D:\VisualStudio\IDE\VC\Tools\MSVC\14.33.31629下面包含了vcrun......
  • C++STL
    STL1.说说STL的基本组成部分STL由6部分组成:容器(Container)、算法(Algorithm)、迭代器(Iterator)、仿函数(Functionobject)、适配器(Adaptor)、空间配制器(Allocator)。容器......
  • 车牌识别(2)-搭建车牌识别模型
    上一期分享了模拟生成车牌的方法,今天分享一下搭建要给简单的车牌识别模型,模拟生成车牌的方法参看:​​车牌识别(1)-车牌数据集生成​​生成的车牌如下图准备数据集,图片放在path......
  • Linux下的lua和boost c++的搭建和安装
    先下载lua,boostc++​​http://www.lua.org/versions.html#5.2​​​​http://www.boost.org/​​ ​​http://sourceforge.net/projects/luabind/​​1.安装lua[root@l......
  • 开源状态机代码生成 StateSmith 支持C/C++
     StateSmithStateSmithisacrossplatform,free/opensourcetoolforgeneratingstatemachines.Thegeneratedcodeishumanreadable,haszerodependencies......