虚基类

文章一: http://blog.sina.com.cn/s/blog_5fb0bb520101a1m0.html

如果去掉虚继承,结果将和GCC结果一样,A,B,C都是8,D为16,原因就是VC的编译器对于非虚继承,父类和子类是共享虚函数表指针的。
虚基类继承:不共享虚函数表了 +4以上字节            正常非虚基类继承:共享虚函数表

gcccodeblock中就没有添加公用继承虚指针”.    gcc 有虚函数时继承下来 是用自己的虚表,虚继承和VS是有公有虚函数表和没公有虚函数表的区别.大家都是用自己的虚函数表放顶部..  VS(已证)在没虚基类继承有虚函数继承的时候,用的是继承下来的base的虚函数表.

为什么会这样跟VS的编译器处理有关系.

有虚继承时:有自己的表

无虚继承时:共享虚函数表



解释为什么IX不能虚继承IUnknown(肯定不能强制里面有或者无虚函数):图


再继承下去如孙子之后就不是原来IUnknown的虚函数表了,CA继承下来的是IX,或者IY的自身虚函数表了


未解决 : 

: error C2248: “A::~A”: 无法访问 private 成员(在“A”类中声明)

class A
{
public://class B:virtual public A-虚基类的时候这里可以私有? 父类指针和继承的区别,如果不是指针因为B对象虚函数表
//访问不了A私有成员函数?
virtual ~A(){};
};


如果构造函数设为虚函数,那么当你在构造父类的构造函数时就不得不显示的调用构造。还有一个原因就是为了防错,试想如果你在子类中一不小心重写了个跟父类构造函数一样的函数,那么你的父类的构造函数将被覆盖,也即不能完成父类的构造.就会出错。




虚基类继承:不共享虚函数表了 +4以上字节            正常非虚基类继承:共享虚函数表

奇怪之处http://blog.sina.com.cn/s/blog_5fb0bb520101a1m0.html




可能是解释:注意:只有子类有新的虚函数时,编译器才会在子类中添加虚表指针 (派生的virtual 析构函数不算是新函数)

只要基类声明为析构函数派生类的所有析构函数自然也为虚函数。所以这里虚析构写不写出来都不会不当是一个新的虚函数出现,所以没自身虚函数表指针.


文章二  也不错:提到了怎么找偏移的函数*(this+0)[0]  ---  *(this指针+调整量)[虚函数在vftable内的偏移]()

http://www.cnblogs.com/fanzhidongyzby/archive/2013/01/14/2859064.html


文章三:很长很多余废话,但有些解释了virtual(即公共含义) 语义,语法

http://blog.sina.com.cn/s/blog_62b1508e0100gwxd.html


文章四:  不太用看,帖出重点http://wenku.baidu.com/link?url=ykCI27amlvL7PyS0tcsNrr0BbBF_TO4-Mb-kbSRevm0cnV8cUmTQAtU_TmBd4a4zRt8hU4nTupTffmdE0dfF4qRQq0QKO1XZWaJD4YIRlZC






文章五:汇编与虚函数表的分析:

http://www.cnblogs.com/cswuyg/archive/2010/08/20/1804111.html


文章六:  

虚​拟​继​承​的​内​存​布​局



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值