1.只存在虚函数时的情况
存在VtPtr指针,指向虚函数表。在普通继承时,子类会修改父类的虚函数表(在尾部添加子类的虚函数指针),所以子类对象的首部不会增加自己的Vtptr。
具体内容见:
http://hi.baidu.com/jjsjmmkifxbaotq/item/0eb7e4304acb3b2cceb9fe3f
2. 存在虚继承关系时的情况
有关虚继承的定义,参见博文http://www.cppblog.com/chemz/archive/2007/06/12/26135.html。
在多层继承关系中,虚基类为各子类共享,即内存中只有一份虚基类对象,所以子类不能修改虚基类的虚函数表,为什么不能修改下文再讲。故虚继承中,子类会有自己的Vtptr,同时会增加一个VBptr指向虚基类对象,所以会增加8B(多继承时会增加8B的整数倍)。
3.为什么不能修改虚基类的虚函数表?
如有下面继承关系的情况发生。
若D1修改了基类B的虚函数表,则继承类D2也会修改B的虚函数表,但是之前D1在虚函数表中的虚函数指针也会被D2所观察到,但是D2并没有继承D1,故没有权限使用D1的函数,所以这是不允许的。因此虚继承基类对象的内容继承类不应该修改。本质原因还是虚基类为所有继承类共享。
其他内容可参考http://www.cnblogs.com/itech/archive/2009/03/01/1399996.html