彻底了解C++虚函数、虚继承
一直以来,c++的虚函数以及虚继承令人讨厌。下面通过程序彻底了解c++的虚函数以及虚继承。
继续考虑虚继承对类size的影响。
继承类虚拟继承基类时,继承类的size变成4,这是为什么???
而考虑菱形结构的虚继承的另外一种方式:
继承类虚拟继承基类时,继承类的size变成4,这是为什么???
菱形虚拟继承的常见方式:
继承类虚拟继承基类时,继承类的size变成4,这是为什么???
接着考虑,基类中有虚函数,无虚继承的情况:
前面都是对称的情况,下面考虑一些非对称的情形。例如:基类B1中无虚函数,而B2、B3有虚函数,无虚继承
基类中无虚函数,继承类中有虚函数
B1无虚函数,B2、B3虚继承B1,D继承B2、B3为public
B1有虚函数,B2、B3虚继承B1,并且B2、B3没有虚函数,D继承B2、B3为public,D中没有虚函数
B1含有虚函数,B2和B3虚继承B1,B2和B3也含有虚函数,D公共继承B2和B3,此时D有无虚函数无所谓
B1含有虚函数,B2和B3公共继承B1(此时B2和B3有无虚函数无所谓),D虚拟继承B2、B3,那么D有无虚函数对D有影响
D中无虚函数,各个类的size如左下图
如果D中有虚函数,各个类的size如右上图,具体的类结构见下图:
B2和B3虚拟继承B1(此时B1有无虚函数有影响),D虚拟继承B2、B3,那么B2、B3、D有无虚函数对B2、B3、都有D有影响
上面的两个结果为类D中有无成员方法V3()的结果,有V3时D的size为28,没有V3时D的size为24.而在B1、B2、B3中有无非虚成员方法对各个类无影响。
上面的两个结果为类D有虚函数,并且D中有无成员方法V3()的结果,有V3时D的size为28,没有V3时D的size为24.而在B1、B2、B3中有无非虚成员方法对各个类无影响。