intmain(){ // 在64位系统下 std::cout << "Size of NonVirtual: " << sizeof(NonVirtual) << std::endl; // 输出 4 std::cout << "Size of WithVirtual: " << sizeof(WithVirtual) << std::endl; // 输出 16 (8 for vptr + 4 for data + 4 padding) }
面向对象支柱:继承
继承代价:编译器引入额外信息增加了对象体积,访问虚拟基类成员的速度比普通继承稍慢。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#include<iostream>
classBase { virtualvoidf(){} }; // 有vptr classDerived1 : public Base {}; // 继承vptr classDerived2 : public Base {}; // 继承vptr classDiamond : public Derived1, public Derived2 {}; // 菱形继承问题
classVDerived1 : virtualpublic Base {}; // 虚拟继承 classVDerived2 : virtualpublic Base {}; // 虚拟继承 classVDiamond : public VDerived1, public VDerived2 {};
intmain(){ // 在64位系统下 std::cout << "Size of Base: " << sizeof(Base) << std::endl; // 8 (vptr) std::cout << "Size of Diamond: " << sizeof(Diamond) << std::endl; // 16 (Base via D1: vptr + Base via D2: vptr) std::cout << "Size of VDiamond: " << sizeof(VDiamond) << std::endl; // 24 (D1 part: vptr/vbptr, D2 part: vptr/vbptr, shared Base part) // 具体大小高度依赖编译器实现 }