文章一: http://blog.sina.com.cn/s/blog_5fb0bb520101a1m0.html
如果去掉虚继承,结果将和GCC结果一样,A,B,C都是8,D为16,原因就是VC的编译器对于非虚继承,父类和子类是共享虚函数表指针的。
虚基类继承:不共享虚函数表了 +4以上字节 正常非虚基类继承:共享虚函数表
gcc或codeblock中就没有添加“公用继承虚指针”. 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://www.cnblogs.com/cswuyg/archive/2010/08/20/1804111.html
文章六:
虚拟继承的内存布局