C++ 虚函数理解


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;



          

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值