可以清晰看出这里0xaaaa0000只有一个,而这时前面多了两个值,obj的大小为12字节,前面蓝色的地址就是C类的虚基指针(vbtable)如果A有虚函数的话,在蓝色和红色之间还会加上虚函数表(vftable)这时就占16字节了。这里就不具体介绍多重继承的虚表的内存分布了。 好了,下面就是本文的重点了,来看看obj对象创建时,调用构...
同是,虽然没有虚函数,虚继承一样会引入虚表指针。上面的菱形继承中引入了三个虚表指针,但是编译器把其中两个合并成了一个,所以最终从图中还能看到两个虚表指针。当然了,我们也可以很明显地看到,虽然指向的都是类D的实例,派生类和基类的指针存储的指针地址是不完全相同的 。 结语 本文主要讨论了「指向类变量的指...
虚函数替换过程与前面描述类似,只是多了一个虚函数表,多了一次拷贝和替换的过程。 虚函数的调用过程,与前面描述基本类似,区别在于基类指针指向的位置可能不是派生类对象的起始位置,以如下面的程序为例: 5. 菱形继承 本文不讨论菱形继承的情形,个人觉得:菱形继承的复杂度远大于它的使用价值,这也是C++让人又爱又恨...
其中:D自身的虚函数与B基类共用了同一个虚函数表,因此也称B为D的主基类(primary base class)。 虚函数替换过程与前面描述类似,只是多了一个虚函数表,多了一次拷贝和替换的过程。 虚函数的调用过程,与前面描述基本类似,区别在于基类指针指向的位置可能不是派生类对象的起始位置,以如下面的程序为例: 5. 菱形继承...
方式2:虚继承:在继承方式前加上virtual。 classB:virtualpublicA{public:intage;};classC:virtualpublicA{public:string sex;}; 多继承是C++复杂的一个体现。有了多继承,就存在菱形继承,为了解决菱形继承,又出现了菱形虚拟继承,其底层实现又很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。
在菱形继承中,有多重继承的问题,从不同途径继承来的同一基类,会在子类中存在多份拷贝。这将存在两个问题:其一,浪费存储空间;第二,存在二义性问题。 虚继承一般通过虚基类指针和虚基类表实现,每个虚继承的子类都有一个虚基类指针vbptr(占用一个指针的存储空间,4字节)和虚基类表(不占用类对象的存储空间)(多重...
(3)菱形继承:多重继承掺杂隔代继承1-n-1模式,此时需要用到虚继承,例如 B,C虚拟继承于A,D再多重继承B,C,否则会出错继承的代码表示为: 继承方式规定了如何访问继承的基类的成员。继承方式指定了派生类成员以及类外对象对于从基类继承来的成员的访问权限继承权限:子类继承基类除构造和析构函数、基类的重载运算符、...
C++内存分布之菱形继承(无虚函数) 菱形继承的定义是:两个子类继承同一父类,而又有子类同时继 承这两个子类。例如a,b两个类同时继承c,但是又有一个d类同时 继承a,b类。探究的过程还是很有趣的。菱形继承的内存布局探究 花了我几天时间,探究起来还是有点难度的。博文中如果有错误的地 ...
虚函数、虚函数表、派生类虚表,对象内存布局 模板与泛型编程:模板定义、实例化、模板编译、模板特化 继承:单继承、多继承、菱形继承、虚继承 强制类型转换:static_cast, const_cast, reinterpret_cast,dynamic_cast, 异常处理、命名空间 现代C++:C++1X、C++20 新特性 ...