【C++札记】虚继承
由于多重继承产生的二义性引入了类的虚继承,先看下什么是二义性。
类D是类B和类C的派生类,而类B,类C就是继承于类A,当D调用类A中的函数时不知道是类B继承A的,还是类C继承A的,引起了二义性。虚继承可以解决这个问题。
使用语法:
class 派生类:virtual 继承方式 虚基类
{
};
上图中类D 实例化过程中的初始化顺序:
祖父类(A)--->父类(从左到又)--->子类,并且最后一次初始化有效
#include <iostream>
#include <string>
using namespace std;
class A
{
public:
A(int a):i(a)
{
cout << "construct A" << endl;
}
void displaya()
{
cout << "A:" << i << endl;
}
private:
int i;
};
class B:virtual public A //虚继承
{
public:
B(int a): A(a),i(a)
{
cout << "construct B" << endl;
}
void displayb()
{
cout << "B:" << i << endl;
}
private:
int i;
};
class C:virtual public A //虚继承
{
public:
C(int a):A(2),i(a)
{
cout << "construct C" << endl;
}
void displayc()
{
cout << "C:" << i << endl;
}
private:
int i;
};
class D: public B, public C //多重继承
{
public:
D(int a, int b, int c, int d):A(a), B(b), C(d), i(c) //必须初始化虚基类X,X(d)
{
cout << "construct Z" << endl;
}
void displayd()
{
cout << "D:" << i << endl;
}
private:
int i;
};
int main()
{
D d(1,2,3, 4);
d.displaya();
d.displayb();
d.displayc();
d.displayd();
}
运行结果:
编译器在实例化D时,之调用了一次虚基类的构造函数,忽略了虚基类A派生类B,C对续虚基类构造函数的调用,保证了虚基类的数据成员不会被初始化多次。
【C++札记】虚继承的更多相关文章
- 虚基类&虚继承
发现这个月准备竞赛完全没有更新哎... 改了下某华大一c++测试题...网上对虚继承讲的要么太繁琐要么不到位,自力更生 #include<iostream> #include<fst ...
- C++继承,多重继承,虚继承的构造函数以及析构函数的调用顺序问题
#include <iostream> using namespace std; class A{ int data_a; public: A(){ data_a = ; cout < ...
- C++中虚继承派生类构造函数的正确写法
最近工作中某个软件功能出现了退化,追查下来发现是一个类的成员变量没有被正确的初始化.这个问题与C++存在虚继承的情况下派生类构造函数的写法有关.在此说明一下错误发生的原因,希望对更多的人有帮助. 我们 ...
- C++虚函数、虚继承、对象内存模型(转)
参考:http://blog.csdn.net/hxz_qlh/article/details/14633361 需要注意的是虚继承.多重继承时类的大小.
- 虚函数列表: 取出方法 // 虚函数工作原理和(虚)继承类的内存占用大小计算 32位机器上 sizeof(void *) // 4byte
#include <iostream> using namespace std; class A { public: A(){} virtual void geta(){ cout < ...
- C++对象模型:单继承,多继承,虚继承
什么是对象模型 有两个概念可以解释C++对象模型: 语言中直接支持面向对象程序设计的部分.对于各种支持的底层实现机制. 类中成员分类 数据成员分为静态和非静态,成员函数有静态非静态以及虚函数 clas ...
- C++中的虚继承 & 重载隐藏覆盖的讨论
虚继承这个东西用的真不多.估计也就是面试的时候会用到吧.. 可以看这篇文章:<关于C++中的虚拟继承的一些总结> 虚拟基类是为解决多重继承而出现的. 如:类D继承自类B1.B2,而类B1. ...
- C++ 多继承和虚继承的内存布局(转)
转自:http://www.oschina.net/translate/cpp-virtual-inheritance 警告. 本文有点技术难度,需要读者了解C++和一些汇编语言知识. 在本文中,我们 ...
- C++中的多重继承与虚继承的问题
1.C++支持多重继承,但是一般情况下,建议使用单一继承. 类D继承自B类和C类,而B类和C类都继承自类A,因此出现下图所示情况: A A \ / B C ...
随机推荐
- jar包更新
打包新的jar包 java -jar xx.jar 本地测试后 删除旧的jar包 然后要重启jar包
- learning java FileVisitor 遍丽文件及路径
import java.io.IOException; import java.nio.file.*; import java.nio.file.attribute.BasicFileAttribut ...
- WinDbg常用命令系列---显示段选择器dg、链接列表dl和字符串ds/dS
dg (Display Selector) dg命令显示指定选择器的段描述符. dg FirstSelector [LastSelector] 参数: FirstSelector指定要显示的第一个选择 ...
- hibernate实现增删改查
1.需要先创建学生实体: package pers.zhb.domain; public class Student { private int studentno; private String s ...
- Log4net 控制台打印日志(二)
1.创建控制台程序 2.用NuGet添加log4net引用 3.添加应用程序配置文件:App.config 4.添加配置信息: <?xml version="1.0" enc ...
- 洛谷 P3380 【模板】二逼平衡树(树套树)-线段树套splay
P3380 [模板]二逼平衡树(树套树) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上的数 ...
- CF830E Perpetual Motion Machine
题面 题解 神仙构造题. 分五种情况考虑: 如果存在一个环,那么令环上的点权值为\(1\),其余点权值为\(0\). 如果存在一个度数大于\(3\)的点,令这个点的权值为\(2\),和它相邻的点权值为 ...
- 第06组 Alpha冲刺(1/4)
队名:福大帮 组长博客链接:https://www.cnblogs.com/mhq-mhq/p/11863075.html 作业博客 :https://edu.cnblogs.com/campus/f ...
- javacpp, javacv: 封装了FFmpeg、OpenCV等计算机视觉编程人员常用库的接口
jvavacpp: 一个java调用jni的库,支持安卓. javacv: 封装了FFmpeg.OpenCV等计算机视觉编程人员常用库的接口,可以通过其中的Utility类方便的在包 ...
- el-cascader遇到一个坑的问题
经仔细分析,如果二级和三级的value一样,就会出现这个问题.