虚继承和虚函数

【C++】虚函数和虚继承的内存分布情况 最近做题的时候经常遇到虚函数和虚继承的内存分布情况问题,自己也有点生疏了,所以,赶紧在这里回忆补充一下!先从一个类的内存分布情况开始看起:环境:VS2012class A { int a; public: A() :a(1) {} void fun() { cout<<"A"<<endl; } };按照我的理解,内存中只有 阅读详情

update:6/6,面向对象程序设计

虚函数

在一个基类中声明一个函数为virtual类型,即virtual void Run();那么这个函数就是虚函数,

作用:实现多态,父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。

我这里是

class vehicle{
public:
    int MaxSpeed;
    int Weight;
    virtual void Run(){
        cout<<"NMSL1\n";
    };
    void Stop(){};
};

class bicycle:public vehicle{
public:
    int Height;
    void Run(){
        cout<<"NMSL2\n";
    };
};

class motorcar:public vehicle{
    public:
    int SeatNum;
    void Run(){
        cout<<"NMSL3\n";
    };
};

然后通过父类指针指向子类实例

vehicle vc,*VC;
bicycle bc;
motorcar mc1;

VC=&vc;
VC->Run();

VC=&bc;
VC->Run();

VC=&mc1;
VC->Run();

结果是

NMSL1
NMSL2
NMSL3

如果之前我不声明Run为虚函数,那么结果是:

NMSL1
NMSL1
NMSL1

虚函数最关键的特点是“动态联编”,它可以在运行时判断指针指向的对象,并自动调用相应的函数。

 

虚继承

上面说到,虚函数是在基类中声明,而虚继承不一样,虚继承是在一代子类中声明继承方式为虚继承。

class bicycle:virtual public vehicle{
public:
    int Height;
    void Run(){
        cout<<"NMSL2\n";
    };
};

class motorcar:virtual public vehicle{
    public:
    int SeatNum;
    void Run(){
        cout<<"NMSL3\n";
    };
};

虚继承的作用是:

虚继承 是面向对象编程中的一种技术,是指一个指定的基类,在继承体系结构中,将其成员数据实例共享给也从这个基类型直接或间接派生的其它类。

虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。

类D继承自类B1、B2,而类B1、B2都继承自类A,加入不说明B1\B2继承A的方式,会导致D调用A的函数时出现二义性,不知道是B1继承的A还是B2继承的A,这时候需要引入虚继承。

c++笔记之虚函数、虚继承、多态和虚函数表 1、什么是虚函数? 虚函数是一种由virtual关键字修饰的一种类内函数,可分为虚函数和纯虚函数。还是先上代码看看吧: #include<iostream> #include<memory> class A { public: virtual void func(){std::cout<<"A func() called"<<std::endl;} }; class B:public A { public: void func(){ 阅读详情

相关推荐

C/C++杂记 虚函数的实现的基本原理(图文)

1. 概述 简单地说,每一个含有虚函数(无论是其本身的,还是继承而来的)的类都至少有一个与之对应的虚函数表,其中存放着该类所有的虚函数对应的函数指针。例: 其中: B的虚函数表中存放着B::foo和B::bar两个函数指针。 D的虚函数表中存放的既有继承自B的虚函数B::foo,又有重写(override)了基类虚函数B::bar的D::bar,还有新增的虚函数D::quz。 提示:为了描述方便,本文在探讨对象内存布局时,将忽略内存对齐对布局的影响。 2. 虚函数表构造过程 从编译器的角度来说,B的虚函数表很好构造,D的虚函数表构造过程相对复杂。下面给出了构造D的虚函数表的一种方式(仅供参考

C++语法——详解虚继承

一.什么是虚继承所谓虚继承(virtual)就是子类中只有一份间接父类的数据。该技术用于解决多继承中的父类为非虚基类时出现的数据冗余问题,即菱形继承问题。,那么,当我们用D实例化对象调用a时,编译会报错,因为发生了混淆。除非指定类域B或C。当然指定A也可以,因为默认会从第一个父类中找。此时,D的实例化对象内部结构如下:而当我们使用虚继承时,结构是下图这样,D中只有一份父类A,当我们调用A中数据时,并不会发生冗余。

weixin_61857742的博客 3万+

ArcMap新手必看:Shape属性中的点ZM值到底是什么?如何快速处理

本文深入解析ArcMap中Shape属性中的点ZM值,揭示其在GIS数据中的隐藏维度作用,包括Z值(高程值)和M值(测量值)。针对ZM值可能引发的服务发布问题,提供三种高效处理方案,帮助新手快速掌握数据导入时的ZM值管控策略及精准去除方法。

weixin_42561476的博客 431

【基础知识】虚继承

在多重继承中,如果一个类同时继承自多个基类,而这些基类中又有共同的基类,那么在最终派生类中就会出现多个相同的基类对象,这就导致了“菱形继承”问题(Diamond Inheritance),即同一个基类在派生类中出现了多次。虚继承的使用场景通常是在多重继承中,当某个类需要继承自多个基类,并且这些基类之间存在继承关系时,可以考虑使用虚继承来避免菱形继承问题。然而多重继承也会带来一些问题,其中一个主要的问题就是菱形继承问题,即同一个基类在派生类中出现了多次,这导致了内存占用的增加以及代码调用二义性问题。

m0_56573171的博客 3047

评分卡建模学习(一)————数据预处理part.3

目录六、数据处理的思路及代码(一)对缺失值的处理:在我这个数据预处理的part.1板块(二)对异常值的处理:在我这个数据预处理的part.2板块(三)数据归一化、标准化:在我这个数据预处理的part.2板块(四)非结构化数据转变+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++———————————————————————————————————————————++++++++++++++++++++++++++

Morven_dai的博客 898

Flutter热更新实战:Shorebird从安装到发布补丁的完整流程(含iOS/Android差异解析)

本文详细介绍了Flutter热更新工具Shorebird的完整使用流程,包括安装、发布补丁及iOS/Android平台差异解析。Shorebird作为Flutter官方未提供的Code Push解决方案,能快速修复线上问题,支持合规性保障和性能优化,特别适合紧急修复场景。文章还涵盖了国内CDN加速配置和最佳实践,帮助开发者高效实现热更新。

butter的博客 1078

重学C++系列之虚继承

如何解决C++中的多继承中基类成员重名,产生的二义性,虚继承你值得拥有。

AABond的博客 5071

《R语言实战》第八章之回归分析图形

回归分析图形 回归分析分为简单回归与复杂回归 1 : 简单线性回归即:模型中只包含一个因变量和一个自变量,有时候也会包含多项式, 这个图形描述了身高与体重的线性关系,这也是一个多项式图形 2:当我们的预测变量(自变量)不止一个时,就属于多元线性回归,而且多元线性回归中也可以包含多项式以及交互项 (1)在进行多远回归分析之前可以先描述变量之间的相关关系 上图为一个散点图矩阵,描述了五个变量之间的相关关系,我们可以通过非主对角线的散点图来查看两个变量之间的关系。 多元线性回归简单地就是OLS回归,通过lm和

Strawberry_Ya的博客 1833

虚函数和虚继承

虚函数表指针:vfptr -> 指向一个虚函数表。 虚基类指针:vbptr -> 指向一个虚基类表。 带虚函数的多重继承的内存布局 #include <iostream> using namespace std; class Base1 { public: //三个虚函数 virtual void f() { cout << "Base1::f" << endl; } virtual void g() { cout << .

fzzjoy的专栏 322

电源工程师必看:平均电流模式BUCK双环控制详解(从传递函数到Psim仿真)

本文详细解析了平均电流模式BUCK变换器的双环控制策略,从传递函数推导到Psim仿真实现。针对电源工程师关注的环路设计和稳定性问题,深入比较了电压模式、峰值电流模式和平均电流模式的优缺点,并提供了12V/3A BUCK变换器的完整设计案例,帮助工程师掌握平均电流控制这一中高功率应用的首选方案。

weixin_42696271的博客 396

RK3576 PCIE接口调试:基于RTL8111HS的网卡驱动移植

检查项方法电源电压复位时序检查设备树 reset-gpios链路速率设备识别lspci -vvv驱动加载。

小灰灰的博客 731

虚函数与虚继承

虚函数与虚继承寻踪 封装、继承、多态是面向对象语言的三大特性,熟悉C++的人对此应该不会有太多异议。C语言提供的struct,顶多算得上对数据的简单封装,而C++的引入把struct“升级”为class,使得面向对象的概念更加强大。继承机制解决了对象复用的问题,然而多重继承又会产生成员冲突的问题,虚继承在我看来更像是一种“不得已”的解决方案。多态让对象具有了运行时特性,并且它是软件设计复用的

炎枫coeus的专栏 575

YOLOv11模型改进全攻略:利用轻量化模块实现精度与速度双跃升

如果你在实操中遇到模块替换导致的精度骤降或部署报错,不妨尝试调整轻量化模块的替换比例,或针对性地保留关键层的原始结构。记住,轻量化的核心是“在精度损失可接受的范围内最大化提升效率”,只要结合业务场景灵活取舍,你也能让YOLOv11在资源受限的环境中大放异彩。接下来,我们从模块选型到代码集成,一步步带你打造“轻量且能打”的YOLOv11,真正帮你解决工业落地中的效率与精度痛点。训练过程中关注模型的mAP和推理速度,若精度下降过多,可调整模块替换的比例(如仅替换Backbone的部分卷积层)。

m0_64661770的博客 501

虚函数、纯虚函数和虚继承

抽象类被继承后,子类可以继续是抽象类,也可以是普通类,而虚基类,是含有纯虚函数的类,它如果被继承,那么子类就必须实现虚基类里面的所有纯虚函数,其子类不能是抽象类。实现,每个虚继承的子类都有一个虚基类指针(占用一个指针的存储空间,4字节)和虚基类表(不占用类对象的存储空间)(需要强调的是,纯虚函数是一种特殊的虚函数,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。虚析构函数是为了解决基类的指针指向派生类对象,并用基类的指针删除派生类对象。虚函数、纯虚函数的联系。

weixin_42650596的博客 1150

IPD流程中的RR\OR\IR\PB\SR\AR\CR等名词汇总(基于新的产品包需求架构)

RR:Raw Requirement,原始需求=》IR:Initial Requirement,初始需求=》SR:System Requirement,系统需求=》AR:Allocated Requirement,分配需求=》CR:Process Change Requirement,流程变更需求。

a1809032425的博客 3189

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C++中虚继承产生的虚基类指针和虚基类表,虚函数产生的虚函数指针和虚函数表

本博客主要通过查看类的内容的变化,深入探讨有关虚指针和虚表的问题。 一、虚继承产生的虚基类表指针和虚基类表 如下代码:写一个棱形继承,父类Base,子类Son1和Son2虚继承Base,又来一个类Grandson继承Son1和Son2。 代码: class Base { public: int a; protected: int b; private: int c; }; class Son1 :virtual public Base { public: int a; protected: i

yi_chengyu的博客 8580

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

解析虚函数表和虚继承

之前大二在学C++的时候一直对虚函数和虚继承有些晕(其实好像就是对virtual这个关键字不太熟悉)现在又学习到了一些,对虚函数表和虚继承的机制有了一点更深入的了解。 关于虚函数以及虚继承的基础知识,我自己也总结了一下,点击浅谈C++多态和C++继承可查看,在继承的总结的时候,我没有总结关于虚继承的知识,而且在多态总结也没有设计到太多的虚函数的知识,我是想把这两块集中在一起讲下,也算是自己对vir

xy913741894的博客 5135

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

虚继承和虚函数对sizeof的影响

先看例程: #include #include #include #include using namespace std; class A { public:  char a[3];  virtual void aa(){}  //const int Size; }; class A2 { public:  char a2[3];

Jhuangxue的专栏 1884

C++ 虚函数和虚继承解析

本文针对C++里的虚函数,虚继承表现和原理进行一些简单分析,有不对的地方请指出。下面都是以VC2008编译器对这两种机制内部实现为例。 有喜欢或者想学习C/C++的朋友加一下我的C/C++交流群815393895。谢谢大家的支持 虚函数 以下是百度百科对于虚函数的解释: 定义:在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数[1] 语法:virtual 函...

qq_42785431的博客 474

C++虚继承和虚函数

C++虚继承深入解析基类和派生类的指向内存布局 C++的虚函数常常搞得人晕头转向,很多同学常常混淆不清,今天我们来解析C++的虚函数 基类和派生类的指向 我们来看这样一段代码 #include&amp;lt;iostream&amp;gt; using namespace std; class Base { public: Base(int a):ma() {cout &amp;lt;&amp;lt; &quot;Base:Basee...

王志的博客 561

关于虚函数、虚继承和虚表

一、虚函数         首先,虚函数的定义为在函数前添加关键字virtual。然后,之所以定义虚函数,是为了实现语言的多态性的特点。         虚函数里面有纯虚函数的玩意。通过直接在虚函数后面添加= 0来实现,举例如下:         virtual void (*Fun)() = 0;         应该注意的是,当一个类中出现了至少一个纯虚函数时,这个类就成为了传说中的抽

Hao先森的专栏 1137

C++ 虚继承和虚函数同时存在的对象模型

如果说没有虚函数的虚继承只是一个噩梦的话,那么这里就是真正的炼狱。这个C++中最复杂的继承层次在VC上的实现其实我没有完全理解,摸爬滚打了一番也算得出了微软的实现方法吧,至于一些刁钻的实现方式我也想不到什么理由来解释它,也只算是知其然不知其所以然吧。   分2个阶段来探讨:   1.      有虚函数的派生类虚继承了没有虚函数的基类;   2.      有虚函数的派生类虚继承了有虚

chengonghao的博客 3154

关于虚函数和虚继承

基类中无虚函数,派生类中有虚函数,基类的指针指向派生类对象(指向的是派生类中基类的起始部分),delete 时只析构基类的对象而不析构派生类的对象。 基类指针指向派生类的的情况下,基类的虚构要设为虚析构。 虚表合并时向内层合并,虚表合并时会先拷贝一份副本,然后合并的时候使用副本合并。 虚函数表的生成在编译器间,对象的生成在运行期间。对象的虚函数指针在构造之前就指向虚表了。即虚表的写入时机是...

shang_12266029的博客 354

c++虚函数和虚继承

避免多继承时候的变量或方法模棱两可、也就是避免儿子继承了两个爸爸的同名方法,不知用谁的问题

hiudawn 1139

C++虚函数和虚继承浅析

本文针对C++里的虚函数,虚继承表现和原理进行一些简单分析

lining0420的博客 427
上一篇: upper_bound()与low_bound() 及其返回值问题
下一篇: 运算符++ 重载
Track48
博客等级 码龄10年 301粉丝 127原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值