虚继承是C++编程语言中的一个特性,其主要原理和作用如下: 一、虚继承的原理 虚继承主要是为了解决多重继承中的“菱形继承”问题。在菱形继承中,一个类继承了多个父类,而这些父类又继承了同一个基类,导致子类中存在多份基类的拷贝。这会造成对基类成员的访问存在多义性,必须指定继承链条以确定访问的基类成员。虚继...
再由B和C派生出D,此时D包含了B和C的成员。这样D中就总共出现了2个A成员。大家注意到左边的几个数字,这几个数字表明了D中各成员在D中排列的起始地址,D中的五个成员变量(B::dataA、dataB、C::dataA、dataC、dataD)各占用4个字节,sizeof(D) = 20。 为了跟后文加以比较,我们再来看看B和C的内存布局: ...
2、虚基类表存储的是,虚基类相对直接继承类的偏移(D并非是虚基类的直接继承类,B,C才是) 1#include<iostream>2usingnamespacestd;34classA//大小为45{6public:7inta;8};9classB :virtualpublicA//大小为12,变量a,b共8字节,虚基类表指针410{11public:12intb;13};14classC :virtualpublicA//与B一样1215{...
VirtualInheritance.cpp和NormalInheritance.cpp的不同点在与C和C继承A时使用了virtual关键字,也就是虚继承。同样,我们看看B、C、D类的内存布局情况: 我们可以看到,菱形继承体系中的子类在内存布局上和普通多继承体系中的子类类有很大的不一样。对于类B和C,sizeof的值变成了12,除了包含类A的成员变量dataA外还多...
B C \ / \ / D 在这个图形中,类D通过继承类B和C,同时继承了类A,而类B和C也都继承了类A,这就导致了类D中有两份类A的实例,使用虚继承可以避免这种情况的发生。 总结:举个例子,当你遇到“菱形继承”时,不使用虚继承,当A占10000个字节,B和C继承下来就要各占10000字节,派生给D就要浪费10000个字节。而...
米哈游一面面试题:C++ 中虚函数的原理? 01:53 米哈游一面面试题:C++中野指针和悬挂指针的区别? 01:27 米哈游开发一面:C++有哪些进程间通信的方式? 02:24 百度C++开发一面: C++中构造函数可以是虚函数吗? 01:16 米哈游后端开发一面: C++如何进行性能优化? 05:33 米哈游一面面试题:C++ QT中...
一、虚继承原理 1、虚继承解决继承二义性问题 继承的二义性 :如果 一个 子类 ( 派生类 ) 继承多个 父类 ( 基类 ) , 这些父类 都继承了 相同的父类 , 那么 子类 访问 父类的父类 中的成员 , 就会产生 二义性 ; 报错:error C2385: 对“x”的访问不明确 ; ...
除非指定类域B或C。当然指定A也可以,因为默认会从第一个父类中找。 此时,D的实例化对象内部结构如下: 而当我们使用虚继承时,结构是下图这样,D中只有一份父类A,当我们调用A中数据时,并不会发生冗余。 此时,D对象内部结构是这样: 二.虚继承原理 在上图中,父类数据并不存放在虚继承的子类中,那么子类怎么...
虚继承的实现关键在于引入虚基类。在基类声明时,通过添加"virtual"关键字,派生类只会实例化一个虚基类,而非每个派生类都有一份。编译器会在派生类对象中添加一个指向虚基类实例的指针,所有的虚基类成员访问都通过这个指针间接完成,确保了每个派生类对虚基类的唯一引用。以类A为虚基类,类B和C继承...