C++构造函数语义学(三)(基于C++对象模型)
带有虚基类的情况。

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++对象模型)的更多相关文章
- C++构造函数语义学(二)(基于C++对象模型)
带有虚函数的情况. 下面情况编译器也会在需要的时候为其合成. 1.如果一个类自己声明为虚函数. 1 #include<iostream> 2 using namespace std; 3 ...
- C++构造函数语义学(一)(基于C++对象模型)
如果一个类没有自己的构造函数,编译器会在需要的时候为其合成一个出来,俗称:合成默认构造函数.但是请注意是在需要的时候,并不是所有情况. 请看下面代码: 1 #include<iostream&g ...
- 构造函数语义学——Copy Constructor 篇
构造函数语义学--Copy Constructor 篇 本文主要介绍<深度探索 C++对象模型>之<构造函数语义学>中的 Copy Constructor 构造函数的调用时机 ...
- 构造函数语义学之Copy Constructor构建操作(2)
二.详述条件 3 和 4 那么好,我又要问大家了,条件1 和 2比较容易理解.因为member object或 base class 含有copy constructor.那么member objec ...
- word2vec原理(三) 基于Negative Sampling的模型
word2vec原理(一) CBOW与Skip-Gram模型基础 word2vec原理(二) 基于Hierarchical Softmax的模型 word2vec原理(三) 基于Negative Sa ...
- {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询
Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...
- 构造函数语义学——Default Constructor篇
构造函数语义学--Default Constructor 篇 这一章原书主要分析了:编译器关于对象构造过程的干涉,即在对象构造这个过程中,编译器到底在背后做了什么 这一章的重点在于 default c ...
- STC8H开发(三): 基于FwLib_STC8的模数转换ADC介绍和演示用例说明
目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...
- Keil MDK STM32系列(三) 基于标准外设库SPL的STM32F407开发
Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...
随机推荐
- 【LeetCode】1631. 最小体力消耗路径 Path With Minimum Effort
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 解题思路 并查集 代码 刷题心得 欢迎加入组织 日期 题目地址:https ...
- 【LeetCode】1182. Shortest Distance to Target Color 解题报告 (C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典+二分查找 日期 题目地址:https://lee ...
- 【LeetCode】790. Domino and Tromino Tiling 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/domino-a ...
- 「算法笔记」2-SAT 问题
一.定义 k-SAT(Satisfiability)问题的形式如下: 有 \(n\) 个 01 变量 \(x_1,x_2,\cdots,x_n\),另有 \(m\) 个变量取值需要满足的限制. 每个限 ...
- RabbitMQ学习笔记五:RabbitMQ之优先级消息队列
RabbitMQ优先级队列注意点: 1.只有当消费者不足,不能及时进行消费的情况下,优先级队列才会生效 2.RabbitMQ3.5以后才支持优先级队列 代码在博客:RabbitMQ学习笔记三:Java ...
- Inverse/Implicit Function Theorem
目录 4.1 The Inverse Function Theorem The Implicit Function Theorem 4.3 Curves and Surfaces 4.4 The Mo ...
- Proximal Algorithms 2 Properties
目录 可分和 基本的运算 不动点 fixed points Moreau decomposition 可分和 如果\(f\)可分为俩个变量:\(f(x, y)=\varphi(x) + \psi(y) ...
- IOS 如何获取app更新链接 如【itms-apps://itunes.apple.com/cn/app/id1362432761?mt=8】
这是iTunes接口地址 ,有兴趣可以看一下,我们要用到的接口如下,xxx 处换成自己 App 的 AppId ,AppId 可以在 iTunes Connect 里面看到. http://itune ...
- [c++]关于指针的一些问题记录
const char* 和char* 之间的转换 const char*是指向常量的指针,而不是指针本身为常量,可以不被初始化.该指针可以指向常量也可以指向变量,只是从该指针的角度而言,它所指向的是常 ...
- 完全替代RTD2166方案设计|CS5202直接替代RTD2166|DP转VGA 方案
CS5202可以直接PIN TO PIN替代RTD2166 整体方案设计只需改动一个电阻和一个电容,在性能和参数设定方面与RTD2166可以达成一致,且成本比RTD2166要低,性价比更高.CS520 ...