带有虚基类的情况。

 1 #include<iostream>
2 using namespace std;
3 class X
4 {
5 public:
6 int i;
7 };
8 class A:public virtual X
9 {
10 public:
11 int j;
12 };
13 class B:public virtual X
14 {
15 public:
16 double d;
17 };
18 class C:public A, public B
19 {
20 public:
21 int k;
22 };
23 void foo(A* pa)
24 {
25 pa->i = 1024;
26 }
27 int main()
28 {
29 foo(new A);
30 foo(new C);
31 while (1);
32 return 0;
33 }

分析:

如果不引入虚基类,那么在调用的时候,会发生调用冲突,编译器不知道该调用那个数据成员。

有了虚基类后,假设我们没有定义自己的构造函数,那么编译器会为其合成一个出来,生成一个指向虚基类表的指针。

关于虚基类的布局,以后再深入探讨。

总结:

四种情况,编译器会在需要的时候自己合成一个默认的构造函数出来:

1.带有默认构造函数的类成员

2.带有默认构造函数的基类

3.带有虚函数的类

4.带有虚基类的类

错误思想:

1.任何一个类如果自己没有定义默认的构造函数,那么编译器都会合成一个出来。

2.编译器合成出来的默认构造函数会显式的对类中的数据成员进行的值的设定。

强调:

只有在需要的时候编译器才会为类合成一个默认的构造函数,且合成所作的工作都是编译器认为需要做的,对于不需要的,即使合成了,那一部分工作编译器也不会为其分担丝毫!!!

C++构造函数语义学(三)(基于C++对象模型)的更多相关文章

  1. C++构造函数语义学(二)(基于C++对象模型)

    带有虚函数的情况. 下面情况编译器也会在需要的时候为其合成. 1.如果一个类自己声明为虚函数. 1 #include<iostream> 2 using namespace std; 3 ...

  2. C++构造函数语义学(一)(基于C++对象模型)

    如果一个类没有自己的构造函数,编译器会在需要的时候为其合成一个出来,俗称:合成默认构造函数.但是请注意是在需要的时候,并不是所有情况. 请看下面代码: 1 #include<iostream&g ...

  3. 构造函数语义学——Copy Constructor 篇

    构造函数语义学--Copy Constructor 篇 本文主要介绍<深度探索 C++对象模型>之<构造函数语义学>中的 Copy Constructor 构造函数的调用时机 ...

  4. 构造函数语义学之Copy Constructor构建操作(2)

    二.详述条件 3 和 4 那么好,我又要问大家了,条件1 和 2比较容易理解.因为member object或 base class 含有copy constructor.那么member objec ...

  5. word2vec原理(三) 基于Negative Sampling的模型

    word2vec原理(一) CBOW与Skip-Gram模型基础 word2vec原理(二) 基于Hierarchical Softmax的模型 word2vec原理(三) 基于Negative Sa ...

  6. {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询

    Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...

  7. 构造函数语义学——Default Constructor篇

    构造函数语义学--Default Constructor 篇 这一章原书主要分析了:编译器关于对象构造过程的干涉,即在对象构造这个过程中,编译器到底在背后做了什么 这一章的重点在于 default c ...

  8. STC8H开发(三): 基于FwLib_STC8的模数转换ADC介绍和演示用例说明

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  9. Keil MDK STM32系列(三) 基于标准外设库SPL的STM32F407开发

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

随机推荐

  1. JS监控浏览器窗口是否活动,最小化操作

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. JAVA实现导出excel功能,封装通用导出工具类

    引入maven <!--excel导出--> <dependency> <groupId>net.sourceforge.jexcelapi</groupId ...

  3. 【LeetCode】1409. 查询带键的排列 Queries on a Permutation With Key

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 模拟 日期 题目地址:https://leetcode ...

  4. 【LeetCode】16. 3Sum Closest 最接近的三数之和

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:3sum, three sum, 三数之和,题解,lee ...

  5. Pydantic使用

    Pydantic可以在代码运行时提供类型提示, 数据校验失败时提供友好的错误提示, 使用Python的类型注解来进行数据校验和settings管理 一般使用 from datetime import ...

  6. Chapter 5 Interaction

    目录 5.1 Interaction requires a joint intervention 5.2 Identifying interaction 5.3 Counterfactual resp ...

  7. Representation Learning with Contrastive Predictive Coding

    目录 概 主要内容 从具有序的数据讲起 Contrastive Predictive Coding (CPC) 图片构建序 Den Oord A V, Li Y, Vinyals O, et al. ...

  8. [炼丹术]YOLOv5训练自定义数据集

    YOLOv5训练自定义数据 一.开始之前的准备工作 克隆 repo 并在Python>=3.6.0环境中安装requirements.txt,包括PyTorch>=1.7.模型和数据集会从 ...

  9. [opencv]使用g++编译opencv程序演示

    gcc/g++ 编译命令 1. gcc -E source_file.c -E,只执行到预编译.直接输出预编译结果. 2. gcc -S source_file.c  -S,只执行到源代码到汇编代码的 ...

  10. 解决Java保存到数据库中文乱码问题,加useUnicode=true&characterEncoding=UTF-8

    Java保存到数据库中文乱码, 解决方法如下: 我们在连接MySQL数据库的时候一般都会在url后面添加useUnicode=true&characterEncoding=UTF-8,但是问什 ...