class A
{
public:
int y;
int x;
virtual fun1();
virtual fun2();
}
class B:public class A
{
public:
int z;
virtual fun1();
fun3();
}
这个对象图,说明的是一个类B继承类A,这个是类B的对象内存图
单继承中,首先是VptrB类的Ptr
单看类B不考虑继承 vptr ---------------> (*vfun1)() ------------>class B::fun1;
int z; class B::fun3()//不是虚函数
看下A的对象 vptr ----------------->(*vfun1)()----------------->class A::fun1;
vptr------------------>(*vfun2)()------------------->class A::fun2
int x;
int y;
下面看看继承后的对象B的内存分布情况。首先用文字解释下,继承的过程。1虚表继承(子类的父类虚表的合成,父类在前,除非覆盖,替换),函数列表继承,变量继承,自己变量
在继承父类的虚表时候发现和自己虚表有相同函数指针名得 用子类的实际地址覆盖虚表中函数地址。例如继承后对象B
vptr ---------------> (*vfun1)() ------------>class A::fun1; 子类指针的位置,子类自己指针或者对象调用的时候,首地址+偏移量调用的是自己的方法。
父类型的指针位置也是指向这个地方,但是指针类型的原因,只能指向范围只能指向到变量
y地方,这也是为什么不能调用。父类型指针指向子类,不能调用子类除了overload的虚函数之 外的任何东西的,原理。着也是多态原理
XXXXXX被覆盖 vptr ----------------->(*vfun1)()----------------->class A::fun1;
vptr------------------>(*vfun2)()------------------->class A::fun2
class B::fun3()//不是虚函数
int x;
int y;