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

空基类是否应该影响派生类的布局?

空基类是否应该影响派生类的布局?

空基类是指不包含任何数据成员的基类,它的主要作用是为了实现代码的复用和多态性。在C++中,空基类不会影响派生类的布局,因为它不包含任何数据成员,也没有虚函数。

然而,在某些情况下,空基类可能会影响派生类的布局。例如,如果派生类继承了多个基类,并且这些基类中有空基类,那么空基类可能会导致派生类的布局发生变化。这是因为空基类可能会被视为一个虚基类,从而导致派生类的布局发生变化。

此外,如果派生类继承了多个基类,并且这些基类中有空基类,那么空基类可能会导致派生类的布局发生变化。这是因为空基类可能会被视为一个虚基类,从而导致派生类的布局发生变化。

总之,空基类不会影响派生类的布局,但在某些情况下,空基类可能会导致派生类的布局发生变化。在编写代码时,应该注意这些问题,以确保代码的正确性和可维护性。

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

相关·内容

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

C++中派生类成员访问形式主要有以下两种: 1、内部访问:由派生类中新增成员对继承来成员访问。 2、对象访问:在派生类外部,通过派生类对象对从继承来成员访问。...今天给大家介绍在3中继承方式下,派生类成员访问规则。...private成员在私有派生类中是不可直接访问,所以无论是派生类成员还是通过派生类对象,都无法直接访问从继承来private成员,但是可以通过提供public成员函数间接访问。...private成员在私有派生类中是不可直接访问,所以无论是派生类成员还是派生类对象,都无法直接访问从继承来private成员,但是可以通过提供public成员函数直接访问它们。...private成员在私有派生类中是不可直接访问,所以无论是派生类成员还是通过派生类对象,都无法直接访问private成员。

2.4K70
  • 派生类中虚函数和非虚函数继承效果

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

    7910

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

    二、转换本质 派生类可以转换为本质是: ①为什么派生类可以转换为派生类而来,因此派生类中包含了方法和成员。...此时可以通过指针或引用指向派生类(相当于将派生类中继承那部分方法和成员绑定到上了,相当于派生类被截断了),然后就可以将派生类假装是一个对象来使用(调用其中成员/方法) ②为什么不能转换为派生类...如果将一个对象绑定到派生类指针/引用上,此时派生类通过指针/引用访问自己新定义成员/方法时,发现找不到(因此不能将转换为派生类) 例如:下面B继承于A,子类继承于父,同时为父成员开辟了空间...三、继承方式对类型转换影响 遵循下面3个规则: 假设B继承于A ①只有当B公有地继承A时,用户代码才能使用派生类转换;如果B是受保护/私有的继承于A,则不能使用派生类转换 因为保护或者私有继承...//假设B公有继承于A A *a; B b; a = &b; //将派生类转换为,正确 B *p = a; //将再转换为派生类,错误 五、静态类型/动态类型 在上面我们介绍过,指针或引用可以指向于对象也可以指向于派生类对象

    1.7K10

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

    一、不能自动继承成员函数 构造函数(包括拷贝构造函数) 析构函数 =运算符 二、继承与构造函数 构造函数不被继承,派生类中需要声明自己构造函数。...从输出可以看出: 派生类对象构造次序: 先调用对象成员构造函数,接着是构造函数,然后是派生类对象成员构造函数,最后是派生类自身构造函数。...四、派生类转换 当派生类以public方式继承时,编译器可自动执行转换(向上转型 upcasting 安全转换) 派生类对象指针自动转化为对象指针 派生类对象引用自动转化为对象引用... *>(pm2);     //e1 = m2;  // 私有或保护继承时候,派生类对象无法转化为对象。     ...; // 对象无法强制转化为派生类对象     return 0; } 五、派生类转换 对象指针(引用)可用强制类型转换为派生类对象指针(引用), 而对象无法执行这类转换.

    1.5K00

    c++和继承面试点25连问

    ,先调用构造函数,再调用派生类构造函数; 派生类对象销毁时,先调用派生类析构函数,再调用析构函数。...运行时多态简单来讲就是:使用指针或者引用指向一个派生类对象,在非虚继承情况下,派生类直接继承虚表指针,然后使用派生类虚函数去覆盖虚函数,这样派生类对象通过虚表指针访问到虚函数就是派生类虚函数了...隐藏是指派生类函数屏蔽了与其同名函数,特征如下: 如果派生类函数与函数同名,但是参数不同,此时不论有没有virtual关键字,函数都将被隐藏; 如果派生类函数与函数同名,参数也相同...析构函数是否可以为虚函数?如果可以,有什么作用? 析构函数可以是虚函数,因为它是对象结束时才调用,不影响虚表构建。...多重继承时对象内存布局 非虚继承时,按照继承顺序存储,虚继承时,虚内容放在一块内存最后面存储。 详细看之前这篇文章:c++头脑风暴-多态、虚继承、多重继承内存布局 21.

    96310

    C++:28 --- C++内存布局(上)

    成员函数基本上不影响实例大小。...正如下面访问I对象c1成员那样,如果不是通过指针访问,而是直接通过对象实例,则派生类布局可以在编译期间静态获得,偏移量也可以在编译时计算,因此也就不必要根据虚表项来间接计算了。...一般说来,当从派生类中访问虚成员时,应该先强制转化派生类指针为虚指针,然后一直使用虚指针来访问虚成员变量。这样做,可以避免每次都要计算虚地址开销。 见下例。...与成员变量不同是,通过在派生类中重新定义函数,一个派生类可以覆盖,或者说替换掉函数定义。...“最终派生类”,调用虚析构函数(按照相反顺序) 在VC++中,有虚构造函数接受一个隐藏“最终派生类标志”,标示虚是否需要初始化。

    1.1K20

    C++ 虚拟继承

    虚拟继承与普通继承不同是,虚拟继承可以防止出现diamond继承时,一个派生类中同时出现了两个子对象。也就是说,为了保证 这一点,在虚拟继承情况下,子对象布局是不同于普通继承。...4.2“覆盖”是指派生类函数覆盖函数,特征是: (1)不同范围(分别位于派生类); (2)函数名字相同; (3)参数相同; (4)函数必须有virtual 关键字。...4.3“隐藏”是指派生类函数屏蔽了与其同名函数,特征是: (1)如果派生类函数与函数同名,但是参数不同,此时,不论有无virtual关键字,函数将被隐藏(注意别与重载混淆)。...(2)如果派生类函数与函数同名,但是参数相同,但是函数没有virtual 关键字。此时,函数被隐藏(注意别与覆盖混淆)。...主要大小受三个因素影响: 语言本身所造成额外负担,当语言支持虚时候,就导致一个额外负担,这个一般都是一个虚表指针。里面存储就是虚子对象地址,就是偏移量。

    2.3K80

    C++面试知识总结

    C++程序内存布局与C程序布局类似,区别是C++不再区分全局变量和静态变量是否已经初始化,全部存储在静态存储区;另外堆中存放new/delete申请释放资源,而malloc和free申请资源存放在自由存储区...函数覆盖是指派生类函数覆盖函数,函数名、参数类型、返回值类型一模一样。派生类对象会调用子类中覆盖版本,覆盖父函数版本。 隐藏”是指派生类函数屏蔽了与其同名函数。...覆盖和隐藏区别: 派生类函数与函数同名,但是参数不同。此时,不论有无virtual关键字,函数将被隐藏。 派生类函数与函数同名,参数也相同。...3.5 和子类构造、析构顺序 定义一个对象时先调用构造函数、然后调用派生类构造函数 先派生类析构后析构,也就是说在析构调用时候,派生类信息已经全部销毁了 3.6 深拷贝与浅拷贝区别...,派生类成员函数可以访问公有和受保护成员;公有继承时受保护成员,可以通过派生类对象访问但不能修改。

    1.7K41

    c++头脑风暴-多态、虚继承、多重继承内存布局

    总结一下:c++继承时多态一般指运行时多态,使用指针或者引用指向一个派生类对象,在非虚继承情况下,派生类直接继承虚表指针,然后使用派生类虚函数去覆盖虚函数,这样派生类对象通过虚表指针访问到虚函数就是派生类虚函数了...,后面不再说明; 一个没有虚函数派生出一个没有虚函数派生类,那么这个派生类内存布局就是先成员变量,然后派生类成员变量组成结构体,各成员变量在内存中存储顺序按照声明时顺序来存放; 一个有虚函数...,在64位系统中就是占用8个字节; 一个派生类非虚继承于一个有虚函数,不论派生类是否有同样虚函数,它内存布局都只是在有虚函数基础上增加派生类成员变量,虚表指针是直接继承,指向虚表指针...,如果派生类有同样虚函数,那就覆盖虚表中同名函数,如果是派生类独有的虚函数,那就追加在虚函数表后面; 一个派生类虚继承于一个有虚函数且没有成员变量,则派生类也不会生成它自己虚表指针和虚函数表...,此时内存布局是首先是虚表指针,然后是派生类成员变量,与第4点区别不大; 一个派生类虚继承于一个有虚函数且有成员变量,此时派生类会重新生成它自己虚表指针和虚函数表,内存布局则是派生类虚表指针和成员变量在前

    68220

    C++多态

    D 同时继承 B 和 C,B 和 C 又继承自 A)体系下,虚表在各个布局如何,如果类 B 和 C 同时有一个成员变了 m,m 如何在 D 对象内存地址上分布是否会相互覆盖 存在虚函数对象...如果对象类型是派生类,就调用派生类函数;如果对象类型是,就调用函数。运行期多态就是通过虚函数和虚函数表实现。...如果派生类重写了虚方法,该派生类虚函数表将保存重写虚函数地址,而不是虚函数地址。...如果虚方法没有在派生类中重写,那么派生类将继承虚方法,而且派生类中虚函数表将保存中未被重写虚函数地址。...菱形继承( D 同时继承 B 和 C,B 和 C 又继承自 A)体系下,虚表在各个布局如何,如果类 B 和 C 同时有一个成员变了 m,m 如何在 D 对象内存地址上分布是否会相互覆盖

    1.8K10

    《C++Primer》第十五章 面向对象程序设计

    ),如果希望它派生类有权访问某成员同时禁止其他用户访问,那么应该用protected关键字。...公有、私有和受保护继承 某个对继承而来成员呢访问权限收到两个因素影响:一个是中该成员访问说明符,第二个是在派生类派生列表中访问说明符。...; } } 派生访问说明符对于派生类成员(及其友元)能否访问其直接成员没什么影响。...和其他一样,应该将其接口成员声明为公有的;同时将属于其实现部分分成两组:一组可供派生类访问,另一组只能由友元访问。...虚析构函数 继承关系对拷贝控制最直接影响通常应该定义一个虚析构函数,这样我们就可以动态分配继承体系中对象了。

    1.2K20

    60条面向对象设计原则

    (8)应该只表示一个关键抽象。   包中所有对于同一性质变化应该是共同封闭。一个变化若对一个包影响,则将对包中所有产生影响,而对其他包不造成任何影响 ....(37)派生类必须知道应该知道关于它们派生类任何信息。   (38)所有数据都应当是私有的,不要使用保护数据。   ...(52)在派生类中用方法(也就是什么也不做方法)来覆写方法应当是非法。   (53)不要把可选包含同对继承需要相混淆。把可选包含建模成继承会带来泛滥成灾。   ...(56)只要在面向对象设计中用到了继承,问自己两个问题:(1)派生类是否是它继承那个东西一个特殊类型?(2)是不是派生类一部分?   ...(57)如果你在一个面向对象设计中发现了多重继承关系,确保没有哪个实际上是另一个派生类。   (58)在面向对象设计中如果你需要在包含关系和关联关系间作出选择,请选择包含关系。

    81260

    浅析C++内存布局

    : 单一继承内存布局很清晰,每个派生类中起始位置都是Base class subobject。...所以上述设计其实有错误,带多态性质应该声明一个virtual析构函数。如果class带有任何virtual函数,它就应该拥有一个virtual析构函数。...而C内存布局如下: 可见,派生类C中依其继承顺序,存放了各个subobject及各自vptr,然后才是Class C自己数据成员。...同时也可以想到,随着base class数量增多,派生类里也会首先顺序存放各个subobject。而派生类中也会记录其到各个base subobjectoffset。...B和C内存布局如2.2。接下来看D内存布局: 如上图,D中依次存放B subobject和C subobject。其中B和C中均存放一份class A subobject。

    52310

    后台开发:核心技术与应用实践 -- C++

    同时,无论哪一种继承方式,在派生类中是不能访问私有 成员,私有成员只能被本类成员函数所访问,毕竟派生类不是同一个 构造派生类对象时,必须对数据成员、新增数据成员和成员对象数据成员进行初始化...派生类构造函数必须对这3成员进行初始化,其执行顺序是这样: 先调用构造函数; 再调用子对象构造函数; 最后调用派生类构造函数体 当派生类有多个时,处于同一层次各个构造函数调用顺序取决于定义派生类时声明顺序...在派生时,派生类是不能继承析构函数,也需要通过派生类析构函数去调用析构函数。...在派生类中可以根据需要定义自己析构函数,用来对派生类中所增加成员进行清理工作;清理工作仍然由析构函数负责。...而 虚函数 作用是允许在派生类中重新定义与类同名函数,并且可以通过指针或引用来访问派生类同名函数。

    1.3K10

    C++虚函数

    虚函数是动态多态性基础,其调用方式是动态联编(又称晚期联编,简单解释为只有在程序运行时才决定调用还是子类,系统会根据指针所指向对象来决定要调用函数); 非虚函数与其相反,...(2)在派生类中重新定义此函数,要求函数名、函数类型、函数参数个数和类型全部与虚函数相同,并根据派生类需要重新定义函数体。    ...如果在派生类中没有对虚函数重新定义,派生类简单地继承其直接虚函数。 (3)定义一个指向对象指针变量,并使它指向同一族中需要调用该函数对象。...什么时候应该把一个成员函数声明为虚函数呢? (1)首先看成员函数所在是否会作为。然后看成员函数在继承后有无可能被更改功能,如果希望更改其功能,一般应该讲其声明为虚函数。...(3)应该考虑成员函数调用是通过对象名还是通过指针或引用去访问,如果是通过指针或引用去访问,则应当什么为虚函数。 (4)有时在定义虚函数时,并不定义其函数体,即函数体是

    1.1K30

    61条面向对象设计经验原则

    p18   (8)应该只表示一个关键抽象。p19   包中所有对于同一性质变化应该是共同封闭。一个变化若对一个包影响,则将对包中所有产生影响,而对其他包不造成任何影响 ....p74   (37)派生类必须知道应该知道关于它们派生类任何信息。p74   (38)所有数据都应当是私有的,不要使用保护数据。...现在,把这些对象概括成一个。 p103   (52)在派生类中用方法(也就是什么也不做方法)来覆写方法应当是非法。p103   (53)不要把可选包含同对继承需要相混淆。...p120   (56)只要在面向对象设计中用到了继承,问自己两个问题:(1)派生类是否是它继承那个东西一个特殊类型?(2)是不是派生类一部分?...p121   (57)如果你在一个面向对象设计中发现了多重继承关系,确保没有哪个实际上是另一个派生类

    57220

    【笔记】《C++Primer》—— 第15章:面向对象程序设计

    某个对其继承来成员访问权限受到两个因素影响中此成员访问说明符,这是最重要一部分,private成员不管怎么样都无法被其他使用,其他级别受到下一项影响 派生类派生列表访问说明符...,这一项决定派生类对继承来成员对外表现出最高权限,也就是这一项并不会影响派生类内部使用,但是一旦外部想调用派生类来使用成员: 如果此时访问说明符为public,则成员对外表现如权限 如果此时为...,目标的静态类型决定了其是否可见 和其他作用域一样,派生类可以重用名字,因此当名字重叠时派生类名字会隐藏名字,类似函数中情形。...因此派生类虚函数形参应该相同 派生类可以覆盖重载函数,但是如果派生类希望重载几个函数都在派生类中可见,避免名称隐藏的话:一种方法是不覆盖任何一个重载函数或将所有重载函数都进行一次覆盖...因此编译器在构造和析构时候只往搜索来得到所需成员 C11中,我们可以用using重用定义构造函数,写法和15.6中指明重载函数一样,效果与定义一个构造函数然后列表中调用构造函数一致

    51720
    领券