首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

虚拟基类函数中派生类的大小

是指在C++中,当一个派生类继承了一个或多个虚拟基类时,派生类对象的大小会受到影响。虚拟基类是为了解决多重继承中的菱形继承问题而引入的概念。

在C++中,当一个类继承了一个虚拟基类时,编译器会在派生类对象中插入一个虚基类指针(vptr)来指向虚基类的子对象。这个虚基类指针的大小是固定的,不会随着派生类的大小而变化。

派生类的大小由以下几个因素决定:

  1. 派生类自身的成员变量大小:派生类中定义的成员变量所占用的空间大小。
  2. 基类的大小:如果派生类继承了其他非虚拟基类,那么这些基类的大小也会被计算在派生类的大小中。
  3. 虚基类指针的大小:如果派生类继承了一个或多个虚基类,那么每个虚基类都会在派生类对象中占用一定的空间。

虚拟基类的优势在于解决了多重继承中的菱形继承问题,即当一个派生类同时继承了两个或多个具有共同基类的类时,会出现同一个基类在派生类中存在多个实例的情况。通过使用虚拟基类,可以确保共同基类在派生类对象中只有一个实例,避免了数据冗余和访问混乱的问题。

虚拟基类的应用场景包括:

  1. 多重继承中的菱形继承问题:当一个派生类需要同时继承多个具有共同基类的类时,可以使用虚拟基类来解决数据冗余和访问混乱的问题。
  2. 多层次的继承关系:当继承关系比较复杂时,使用虚拟基类可以简化继承结构,提高代码的可读性和可维护性。

腾讯云提供了一系列的云计算产品,其中与虚拟基类函数中派生类的大小相关的产品和文档如下:

  1. 腾讯云计算服务(CVM):提供弹性计算能力,可根据业务需求灵活调整计算资源,详情请参考:https://cloud.tencent.com/product/cvm
  2. 腾讯云对象存储(COS):提供安全、稳定、低成本的云端对象存储服务,详情请参考:https://cloud.tencent.com/product/cos
  3. 腾讯云数据库(TencentDB):提供多种数据库产品,包括关系型数据库、NoSQL数据库等,详情请参考:https://cloud.tencent.com/product/cdb
  4. 腾讯云安全产品:提供多种网络安全产品,包括云防火墙、DDoS防护等,详情请参考:https://cloud.tencent.com/product/ddos

以上是关于虚拟基类函数中派生类的大小的完善且全面的答案,希望能对您有所帮助。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

派生类多态虚函数

任何构造函数之外非静态函数都可以是虚函数。 关键字virtual只能出现在内部声明语句之前而不能用于外部函数定义。 如果把一个函数声明成虚函数,则该函数派生类也是虚函数。...成员函数如果没被声明为虚函数,则其解析过程发生在编译时而非运行时。就会按照实际情况调用。 派生类可以继承定义在成员,但是派生类成员函数不一定有权访问从继承而来成员。...派生列表形式是:首先是一个冒号,后面紧跟以逗号分隔列表,其中每个前面可以有以下三种访问说明符一个**:public、protected或者private** 派生类必须将其继承而来成员函数需要覆盖那些重新声明...此外,我们能将公有派生类对象绑定到引用或指针上。 大多数都只继承自一个,这种形式继承被称作“单继承”。 派生类函数派生类经常(但不总是)覆盖它继承函数。...如果派生类没有覆盖其某个虚函数,则该虚函数行为类似于其他普通成员,派生类会直接继承其在版本,派生类可以在它覆盖函数前使用virtual关键字,但不是非得这么做(可有可无)。

18920

派生类函数和非虚函数继承效果

而虚函数作用,主要是为了让父指针可以调用子类函数,这种是在运行时才决定调用哪个函数 1、虚函数:   C++函数主要作用是“运行时多态”,父中提供虚函数实现,为子类提供默认函数实现。...子类可以重写父函数实现子类特殊化。 2、纯虚函数:   C++包含纯虚函数,被称为是“抽象”。抽象不能使用new出对象,只有实现了这个纯虚函数子类才能new出对象。   ...C++纯虚函数更像是“只提供申明,没有实现”,是对子类约束,是“接口继承”。   C++纯虚函数也是一种“运行时多态”。...3、普通函数:   普通函数是静态编译,没有运行时多态,只会根据指针或引用“字面值”对象,调用自己普通函数。   普通函数是父为子类提供“强制实现”。   ...因此,在继承关系,子类不应该重写父普通函数,因为函数调用至于对象字面值有关。 参考链接

8410
  • c++继承 派生类函数

    参考链接: C++继承 继承    关系有组合、继承和代理。继承本质就是代码复用。子类继承父一些东西,父也称为,子类也称为派生类派生类继承了除构造函数以外所有成员。 ...不同访问限定符下(public、protected、private)成员以不同继承方式继承,在派生类访问限定也不同,具体如下:  布局优先于派生类  #include<iostream...1.调用构造函数 2.调用派生类构造函数 派生类析构可想而知: 1.调用派生类析构函数 2.调用析构函数  虚函数  如下程序:  class Base { public:     Base...中含有虚函数,那么布局存在一个虚函数指针,指向虚函数表;且其派生类与其同名同参函数不需要加virtual也是虚函数。...此时派生类布局如下:     vfptr指针大小为4(32位机器)。因此字节数为8,派生类为12。

    1.1K20

    C# 继承 派生类初始化C# 多重继承

    当创建一个时,程序员不需要完全重新编写新数据成员和成员函数,只需要设计一个新,继承了已有的成员即可。这个已有的被称为,这个新被称为派生类。...派生类 一个可以派生自多个或接口,这意味着它可以从多个或接口继承数据和函数。...C# 创建派生类语法如下: class { ... } class : { ... } 假如一个是Shape,一个派生类是Rectangle...派生类继承了成员变量和成员方法。...、一个在继承另一个同时,还可以被其他继承 5、在 C# ,所有的都直接或者间接继承自 Object using System; using System.Collections.Generic

    4.5K20

    C++中派生类成员访问形式

    今天给大家介绍在3继承方式下,派生类成员访问规则。...private成员在私有派生类是不可直接访问,所以无论是派生类成员还是通过派生类对象,都无法直接访问从继承来private成员,但是可以通过提供public成员函数间接访问。...当继承方式为公有继承时,public成员和protected成员被继承到派生类仍作为派生类public成员和protected成员,派生类其它成员可以直接访问它们。...private成员在私有派生类是不可直接访问,所以无论是派生类成员还是派生类对象,都无法直接访问从继承来private成员,但是可以通过提供public成员函数直接访问它们。...private成员在私有派生类是不可直接访问,所以无论是派生类成员还是通过派生类对象,都无法直接访问private成员。

    2.4K70

    C++:43---派生类转换、静态动态变量

    二、转换本质 派生类可以转换为本质是: ①为什么派生类可以转换为派生类而来,因此派生类包含了方法和成员。...main() { A *a; B b; C c; a = &b; //正确 a = &c; //错误 return 0; } ②B不论以什么方式继承于A,B成员函数和友元可以将派生类对象向转换...,那么调用时候也取决于左边类型 转换之后,只能通过派生类访问属于自己(那一部分,而不能访问属于派生类数据成员(见下面演示案例③) 虚函数调用是个例外:虚函数调用是取决于指针或引用所指向类型...()函数为虚函数,但是多态只有发生在指针/引用指向于派生类情况下才会发生,此处是普通对象,而不是引用/指针,因此访问还是Ashow2()函数 ?...//错误,num属于B,而A内不含有此成员 return 0; } 七、其他情境下类型转换 当我们用一个派生类对象为一个对象初始化或赋值时,只有该派生类对象部分会被拷贝、移动或赋值

    1.7K10

    从零开始学C++之继承(二):继承与构造函数派生类转换

    一、不能自动继承成员函数 构造函数(包括拷贝构造函数) 析构函数 =运算符 二、继承与构造函数 构造函数不被继承,派生类需要声明自己构造函数。...声明构造函数时,只需要对本类中新增成员进行初始化,对继承来成员初始化调用构造函数完成(如果没有给出则默认调用默认构造函数)。...派生类构造函数需要给构造函数传递参数 #include  using namespace std; class ObjectB { public:     ObjectB...从输出可以看出: 派生类对象构造次序: 先调用对象成员构造函数,接着是构造函数,然后是派生类对象成员构造函数,最后是派生类自身构造函数。...四、派生类转换 当派生类以public方式继承时,编译器可自动执行转换(向上转型 upcasting 安全转换) 派生类对象指针自动转化为对象指针 派生类对象引用自动转化为对象引用

    1.5K00

    202453学习笔记:派生类默认成员函数

    6个默认成员函数,“默认”意思就是指我们不写,编译器会变我们自动生成一个,那么在派生类 ,这几个成员函数是如何生成呢?...要明确是,继承关系里,先有父派生类才能去继承,所以派生类构造函数必须要遵守先父后子原则,必须调用构造函数初始化那一部分成员。...如果没有默认构造函数,则必须在派生类构造函数初始化列表阶段显示调用。 2.拷贝构造 派生类拷贝构造函数必须调用拷贝构造完成拷贝初始化。...此外,父赋值重载会和派生类赋值重载构成隐藏,因此使用时要注意 三.析构函数 派生类析构函数会在被调用完成后自动调用析构函数清理成员。...四.总结 构造函数规则一般都于析构函数相反,.派生类对象初始化先调用构造再调派生类构造, 派生类对象析构清理先调用派生类析构再调析构。

    8910

    Python接口协议和抽象

    猴子补丁 我们可以通过猴子补丁来进一步认识,Python协议约定是怎么回事。猴子补丁是这样一种技术:在运行时修改或模块,而不改动源码。...抽象 Python抽象是指必须让继承它子类去实现它所要求方法。...Pythoncollections.abc模块中就定义了很多抽象: 虽然我们在实际编程并不会自己编写抽象(一般也不建议这样做,因为可能会导致意想不到问题),但是了解抽象,可以帮助我们更好理解...白鹅类型是指只要cls是抽象(即cls是abc.ABCMeta),就可以使用isinstance(obj, cls)。它基本特性是,即便不继承,也有办法把一个注册为抽象虚拟子类。...Python不会检查虚拟子类是否实现了抽象要求实现方法,而是由我们自己保证,并捕获异常。具体会在下篇文章《Python抽象定义与使用》进行介绍。

    1.8K30

    Python协议 、鸭子类型 、 抽象 、混入

    本篇文章探讨一下python几个概念:协议 、鸭子类型 、 抽象 、混入。 一、协议 在python,协议是一个或一组方法。...三、抽象 抽象就是定义各种方法而不做具体实现,任何继承自抽象必须实现这些方法,否则无法实例化。 那么抽象这样实现目的是什么呢? 假设我们在写一个关于动物代码。...示例2定义了一个抽象 Animal,它包含两个抽象方法eat和voice,Dog和Bird都继承了Animal,并各自实现了具体eat和voice方法。...print(issubclass(Cat, Animal)) 输出: True 这种通过注册和抽象关联起来叫做虚拟子类,虚拟子类不会继承注册抽象,而且任何时候都不会检查它是否符合抽象接口...为了避免运行时错误,虚拟子类要实现所需全部方法。 抽象并不常用,但是在阅读源码时候可能会遇到,因此还是要了解一下。 四、混入(mixin class) 混入是为代码重用而生

    1.9K20

    C++核心准则​讨论:将析构函数设为公共和虚拟,或受保护和非虚拟

    析构函数应该是虚函数吗?也就是说,是否应该允许通过指向指针进行销毁?如果是,则base析构函数必须是公共才能被调用,否则虚拟调用它会导致未定义行为。...否则,应该对其进行保护,以便只有派生类才能在自己析构函数调用它,这个析构函数也应该是非虚,因为它不需要虚拟地运行。...这种情况导致较早编码标准对所有析构函数都必须是虚拟提出了全面的要求。这太过分了(即使是常见情况);相反,规则应该是当且仅当析构函数是公共时,才将它们虚函数化。...如第39项所述,对于普通成员函数,选择之间是允许以非虚拟方式(通过指向Base指针)调用它(但如果它调用虚拟函数(例如在NVI或模板方法模式),则可能具有虚拟行为) ),实际上还是根本没有。...因此,如果可以调用(即是公共析构函数,则它是虚拟,否则是非虚拟

    1.1K20

    C++ 虚拟继承

    1.为什么要引入虚拟继承 虚拟继承是多重继承特有的概念。虚拟是为解决多重继承而出现。如:D继承自B1、B2,而B1、B2都继 承自A,因此在D两次出现A变量和函数。...虚拟继承与普通继承不同是,虚拟继承可以防止出现diamond继承时,一个派生类同时出现了两个子对象。也就是说,为了保证 这一点,在虚拟继承情况下,子对象布局是不同于普通继承。...4.2“覆盖”是指派生类函数覆盖函数,特征是: (1)不同范围(分别位于派生类); (2)函数名字相同; (3)参数相同; (4)函数必须有virtual 关键字。...4.3“隐藏”是指派生类函数屏蔽了与其同名函数,特征是: (1)如果派生类函数函数同名,但是参数不同,此时,不论有无virtual关键字,函数将被隐藏(注意别与重载混淆)。...(2)如果派生类函数函数同名,但是参数相同,但是函数没有virtual 关键字。此时,函数被隐藏(注意别与覆盖混淆)。

    2.4K80

    、扩展──页面重构模块化设计(五)

    、扩展──页面重构模块化设计(五) 由 Ghostzhang 发表于 2010-06-11 19:24 和 扩展 是这个系列主要内容,上一篇《 模块化核心思想──页面重构模块化设计...也就是说,当出现多个类似的模块时,包含了这些模块大部分效果(或者理解为公共部分),在基础上,我们可以通过添加很少代码——扩展,来达到所需要要效果。...当然前提是这两个模块有能找到类似的点,能够形成。 在这两个模块,我们不难看出,A模块和B模块在信息部分是很类似的,虽然B模块列表不需要A模块评论部分,但这并不影响B模块表现。...所以我们可以把这两个模块看成类似模块。另个,以哪个为呢?从满足大部分效果这个要求来看,很明显A模块做为是要比B模块做为更合适,如果用B模块做,那么需要写更多扩展来满足A需要。...*/ 别忘了提示条,虽然是用于模块,但它应该是可以被更广泛使用模块,因此我把它单独提了出来: /* S 提示条 */ .mode_hint{position:relative;margin:

    72550

    C++虚拟继承与虚

    多重继承使得派生类关系变得更为复杂,其中一个容易出现问题是某个沿着不同路径被派生类继承(即形成所谓“菱形继承”),从而导致一个派生类对象存在同一个对象多个拷贝。...image.png 多重继承带来同一个对象在派生类对象存在多个拷贝问题,考察如下代码。...(2)被虚拟继承,叫做虚。虚实际指的是继承方式,而非一个,是动词,而非名词。 (3)为了实现虚拟继承,派生类对象大小会增加4。...(4)虚拟继承,虚对象是由最远派生类构造函数通过调用虚构造函数进行初始化派生类构造函数成员初始化列表必须列出对虚构造函数调用;如果未列出,则表示使用该虚缺省构造函数。...因为虚拟继承只是表名某个对象在派生类对象只被构造一次,而在本例Student和Employee对象在EGStudent对象本来就不会被构造多次,所以不将它们申明虚也是完全可以

    90320

    【C++】万字一文全解【继承】及其特性__(20)

    4)成员经过不同继承以后分别到派生类什么作用域中【访问方式变化】 记忆与理解: 权限大小:public > protect > private public成员,经过什么继承,就到派生域什么作用域中...(在子类成员函数,可以使用 ::成员 显示访问) 需要注意是如果是 成员函数 隐藏,只需要函数名相同就构成隐藏。 注意在实际在继承体系里面最好不要定义同名成员。...五.派生类默认成员函数生成机制 6个默认成员函数,“默认”意思就是指我们不写,编译器会变我们自动生成一个,那么在派生类 ,这几个成员函数是如何生成呢?...派生类构造函数必须调用 构造函数初始化那一部分成员。如果没有默认构造函数,则必须在派生类构造函数初始化列表阶段显示调用。...派生类析构函数会在被调用完成后自动调用 析构函数清理成员。因为这样才能 保证派生类对象先清理派生类成员再清理成员顺序。 派生类对象初始化先调用 构造再调派生类构造。

    15510

    C++继承

    private继承: 所有 public 成员在派生类均为 private 属性; 所有 protected 成员在派生类均为 private 属性; 所有 private...派生类构造函数必须调用构造函数初始化那一部分成员。如果没有默认构造函数,则必须在派生类构造函数初始化列表阶段显示调用。...派生类析构函数会在被调用完成后自动调用析构函数清理成员。因为这样才能保证派生类对象先清理派生类成员再清理成员顺序。 派生类对象初始化先调用构造再调派生类构造。..._name = "peter"; } 虚拟继承原理 其实这个原理讲解很复杂,博主知识讲解能力有限,所以只给出结论: 它在继承之后并不会创造出两个成员来给派生类继承,而是在派生类记录两个偏移量...,大小为从派生类继承成员地址到真正成员地址偏移量大小,被放在最后一次继承派生类末尾 继承和组合 1 public继承是一种is-a关系。

    9310

    深入浅出C++虚函数vptr与vtable

    首先,每个使用虚函数(或者从使用虚函数派生)都有自己虚拟表。该表只是编译器在编译时设置静态数组。虚拟表包含可由对象调用每个虚函数一个条目。...此表每个条目只是一个函数指针,指向该类可访问最派生函数。 其次,编译器还会添加一个隐藏指向指针,我们称之为vptr。vptr在创建实例时自动设置,以便指向该类虚拟表。...与this指针不同,this指针实际上是编译器用来解析自引用函数参数,vptr是一个真正指针。 因此,它使每个对象分配大一个指针大小。这也意味着vptr由派生类继承,这很重要。...Base::fun1() 引用指向派生类实例 Base::fun1() 指针指向派生类实例并调用虚函数 Derived::fun1() 引用指向实例并调用虚函数 Derived::fun1...例如,上述通过指针指向派生类实例,并调用虚函数,将上述代码简化为: Base *pt = new Derived(); // 指针指向派生类实例 cout<<"指针指向派生类实例并调用虚函数

    4.3K30

    【C++】从零开始认识多态

    协变:派生类重写函数时,与函数返回值类型不同: 函数返回对象指针或者引用 派生类函数返回派生类对象指针或者引用 这样情况称为协变。...传派生类,因为多态函数指针,那么就会切片出来一个(虚函数表是派生类),那么就会在派生类虚表调用对应虚函数。 这样就实现了执行谁就调用谁!!! 运行过程中去虚表找对应函数调用。...菱形继承和菱形虚拟继承 实际我们不建议设计出菱形继承及菱形虚拟继承,一方面太复杂容易出问题,另一方面这样模型,访问成员有一定得性能损耗。...首先派生类成员是不会有虚表指针,虚表指针都在部分!!! 我们这四个都有自身函数 菱形继承,B与C都继承于A,所以BC是派生类,就不需要有独立虚表指针,而是与A共用。...父有了就与父共用,父没有才会独立创建。 菱形虚拟继承,B与C虚拟继承于A,A被单独出去了,那么B与C函数就不能放在A里,因为A是共享,放进去就会产出问题!

    8710
    领券