使用虚基类的作用,虚基类怎么用

 2023-06-16  阅读 767  评论 0

摘要:虚基类怎么用POD,全称plain old data,plain代表它是一个普通类型,old代表它可以与c兼容,可以使用比如memcpy()这类c中最原始函数进行操作。C++11中把POD分为了两个基

虚基类怎么用

POD,全称plain old data,plain代表它是一个普通类型,old代表它可以与c兼容,可以使用比如memcpy()这类c中最原始函数进行操作。

C++11中把POD分为了两个基本概念的集合

,即:

平凡的(trival)和标准布局的(standard layout)。

首先是平凡的(trival)定义,通常一个平凡的类或者结构体需要满足以下定义:

拥有平凡的

默认构造函数和析构函数。

默认的意思就是由编译器为我们自动生成的,不许是我们自己定义的,但是由于c++11提供了default,也可以是自己定义的加=default,比如

struct Trival{Trival(){}=default;} 就是满足这个要求的,而 struct noTrival{ noTrival(){}; } 就不满足这个要求(哪怕我们定义的构造函数体里面啥都没有)。

这个要求对于带参的构造函数没有束缚。你可以自定义带参的构造函数。

拥有平凡的

拷贝构造函数和移动构造函数。默认的意思同上,也可以使用=default。

拥有平凡的

拷贝赋值操作符和移动赋值操作符。

不能包含虚函数和虚基类。

2.接下来是标准布局的定义:

所有

非静态成员拥有相同的访问级别,(

访问级别就是public,private,protected),

struct t1{ private : int a; public: int b; }就不满足标准布局,因为a,b访问级别不同。

在类和结构体继承时需要满足以下两个情况之一:

派生类中有非静态类,那么这个派生类只能有且只有一个仅包含了静态成员的基类。

基类有非静态成员,那么派生类中不允许有非静态成员。

这两句话看着挺绕口,其实就是在说明一个事实,关于非静态数据的事实,派生类中有非 静态的数据那么它的基类只能是只有静态的,而且基类只能有一个。如果基类有非静态的, 那么派生类就不能有非静态的。有种跷跷板的感觉,非静态的对面坐着的是静态,父子类就 是坐在跷跷板的两端这种对应关系。)

类中第一个非静态类型与基类不是同一个类型。比如

struct A:B{

B b;

int c;

}就不符合这个条件。因为A中第一个成员是基类B类型的。

没有虚类和虚基类(与trival中重复)

所有非静态数据成员都符合标准布局的要求,这其实就是一个递归的定义。

所以在C++11中,POD就是满足平凡的(trival)和标准布局(standard layout)这两个方面。可以使用<type_traits>中的is_pod<T>::value判断T是不是POD类型的。

说了这么多,那么为什么我们需要POD这种条件满足的数据呢?

可以使用字节赋值,比如memset,memcpy操作

对C内存布局兼容。

保证了静态初始化的安全有效。

如何使用虚基类

它的目的是消除二义性。

当在多条继承路径上有一个公共的基类,在这些路径中的某几条汇合处,这个公共的基类就会产生多个实例(或多个副本),若只想保存这个基类的一个实例,可以将这个公共基类说明为虚基类。

虚基类的基本原则是在内存中只有基类成员的一份拷贝。这样,通过把基类继承声明为虚拟的,就只能继承基类的一份拷贝,从而消除歧义。用virtual限定符把基类继承说明为虚拟的。

什么叫做虚基类

继承时构造函数的调用顺序:

1,如果继承虚基类,先调用虚基类的构造函数,如果有多个虚基类,按顺序调用。

2,如果继承基类,调用基类的构造函数;如果有多个基类,按顺序调用。

3,如果类中定义了成员对象,调用成员对象的构造函数;如果有多个成员对象,则按成员对象定义的顺序调用;

4,调用自身的构造函数;

析构函数的调用顺序与此相反。

虚基类是什么

A.减少目标代码,纯虚函数和空函数相比相差也就是几个字节, 如果这也算的话确实是减少了。

虚基类作用

根据C++对于虚基类的构造函数“最晚辈派生”调用规则,所有的虚基类的构造函数都要由 a 的构造函数最先调用,系统中有两个虚基类:c 和 e,但由于 e 是 c 的基类,所以 e 的构造函数要先调用(这是第1),c 还有一个基类是 d,也要调用构造函数(这是第2),然后才是调用 c 的构造函数(这是第3)。

c 初始化完后,再初始化 b,而 b 两个基类 d 和 e,e 是虚基类,已经初始化过了,然后是基类 d,要先调用其构造函数 (这是第4),然后是 b 自己的构造函数调用(这是第5)。

c 和 b 都初始化完成了,最后调用 a 的构造函数(这是第6)。

所以整个的顺序是 e,d,c,d,b,a。

版权声明:xxxxxxxxx;

原文链接:https://www.fanque.com.cn/aac4cAG4HAVtWCQ.html

标签: 数据 系统 递归

发表评论:

管理员

  • 内容144525
  • 积分0
  • 金币0
关于我们
l番茄知识网是实用的健康养生科普知识及日常生活保健小常识大全网站,分享春夏秋冬四季健康饮食养生保健小知识、运动对健康的好处、中医养生食疗做法等健康的生活方式及养生之道,学习健康养生百科知识尽在番茄健康养生知识网。
快捷菜单
健康养生知识
联系方式
电话:
地址:
Email:admin@qq.com
注册登录
注册帐号
登录帐号

Copyright © 2022 番茄知识网 Inc. 保留所有权利。 Powered by

页面耗时0.1936秒, 内存占用1.89 MB, 访问数据库18次

鄂ICP备2022009988号-2

  • 我要关灯
    我要开灯
  • 客户电话
    807220904

    工作时间:8:00-18:00

    客服电话

    电子邮件

    admin@qq.com

  • 官方微信

    扫码二维码

    获取最新动态

  • 返回顶部