c++类方法继承与重载内部实现

本文深入探讨了C++中类方法的继承与重载机制,详细解析了子类如何通过vtab指针定位父类方法,以及如何在子类中重载这些方法。通过具体的源代码和目标码分析,展示了方法调用的具体流程。

1、c++类方法继承与重载内部实现

  • 在子类存储开始部分,额外分配指向父类vtab的指针
  • 在实现时,首先定位到父类vtab的入口地址,再根据方法索引,确定最终方法具体地址
  • 较直接方法调用,需要根据vtab进行方法的寻址过程

2、源代码

#include <iostream>

using namespace std ;

class supper
{

        protected :

                virtual void doSome()
                {
                        cout << "supper class method doSome " << endl ;
                }

                virtual void doOther()
                {

                        cout << "supper class method doOther " << endl ;

                }

} ;

class sub : public supper
{

        public:
                using  supper:: doSome ;
                virtual void doSome(int i )
                {

                        cout << "sub class method doSome " << endl ;
                }


               using supper::doOther ;
               virtual void doOther(int other)
               {

                        cout << "sub class method doOther" << endl ;
               }

}
;

int main()
{
        sub s ;
        s.doSome() ;
        s.doOther() ;


}

3、目标码

47	{
   0x0000000000400892 <+0>:	push   %rbp
   0x0000000000400893 <+1>:	mov    %rsp,%rbp
   0x0000000000400896 <+4>:	sub    $0x10,%rsp

48		sub s ;
=> 0x000000000040089a <+8>:	mov    $0x400ae0,%eax
   0x000000000040089f <+13>:	mov    %rax,-0x8(%rbp)

49		s.doSome() ;
   0x00000000004008a3 <+17>:	mov    -0x8(%rbp),%rax
   0x00000000004008a7 <+21>:	mov    (%rax),%rdx
   0x00000000004008aa <+24>:	lea    -0x8(%rbp),%rax
   0x00000000004008ae <+28>:	mov    %rax,%rdi
   0x00000000004008b1 <+31>:	callq  *%rdx

50		s.doOther() ;
   0x00000000004008b3 <+33>:	mov    -0x8(%rbp),%rax
   0x00000000004008b7 <+37>:	add    $0x8,%rax
   0x00000000004008bb <+41>:	mov    (%rax),%rdx
   0x00000000004008be <+44>:	lea    -0x8(%rbp),%rax
   0x00000000004008c2 <+48>:	mov    %rax,%rdi
   0x00000000004008c5 <+51>:	callq  *%rdx

51	
52	
53	}
   0x00000000004008c7 <+53>:	mov    $0x0,%eax
   0x00000000004008cc <+58>:	leaveq 
   0x00000000004008cd <+59>:	retq   

4、目标码结构

在这里插入图片描述

5、目标结构分析

(gdb) p &s
$9 = (sub *) 0x7fffffffe2d8

(gdb) x /xg 0x7fffffffe2d8
0x7fffffffe2d8:	**0x0000000000400ae0**

(gdb) x /xg 0x0000000000400ae0
0x400ae0 <_ZTV3sub+16>:	0x0000000000400922
(gdb) x /s **0x0000000000400922**
0x400922 <supper::doSome()>:	"UH\211\345H\203\354\020H\211}\370\276e\n@"

(gdb) x  /xg 0x0000000000400ae0 + 8
0x400ae8 <_ZTV3sub+24>:	0x000000000040094e
(gdb) x /s **0x000000000040094e**
0x40094e <supper::doOther()>:	"UH\211\345H\203\354\020H\211}\370\276\201\n@"

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值