Maisel 2022-02-24 15:29 采纳率: 81.8%
浏览 21
已结题

C++多继承的情况下派生类如果有N个含虚函数的基类,则派生类对象中会有几个虚表指针,1 还是N?

C++多继承的情况下派生类如果有N个含虚函数的基类,则派生类对象中会有几个虚表指针,1 还是N ?

  • 写回答

1条回答 默认 最新

  • _GX_ 2022-02-24 18:36
    关注

    N个
    下面是一个简单的例子。

    struct A {
        virtual void f() {}
    };
    
    struct B {
        virtual void g() {}
    };
    
    struct C : public A, public B {
        C() {}
        virtual void f() {}
        virtual void h() {}
    };
    
    int main()
    {
        C c;
    }
    

    这是g++生成的汇编代码,可以看出C对象有两个虚表指针

    A::f():
            push    rbp
            mov     rbp, rsp
            mov     QWORD PTR [rbp-8], rdi
            nop
            pop     rbp
            ret
    B::g():
            push    rbp
            mov     rbp, rsp
            mov     QWORD PTR [rbp-8], rdi
            nop
            pop     rbp
            ret
    A::A() [base object constructor]:
            push    rbp
            mov     rbp, rsp
            mov     QWORD PTR [rbp-8], rdi
            mov     edx, OFFSET FLAT:vtable for A+16
            mov     rax, QWORD PTR [rbp-8]
            mov     QWORD PTR [rax], rdx
            nop
            pop     rbp
            ret
    B::B() [base object constructor]:
            push    rbp
            mov     rbp, rsp
            mov     QWORD PTR [rbp-8], rdi
            mov     edx, OFFSET FLAT:vtable for B+16
            mov     rax, QWORD PTR [rbp-8]
            mov     QWORD PTR [rax], rdx
            nop
            pop     rbp
            ret
    C::C() [base object constructor]:
            push    rbp
            mov     rbp, rsp
            sub     rsp, 16
            mov     QWORD PTR [rbp-8], rdi
            mov     rax, QWORD PTR [rbp-8]
            mov     rdi, rax
            call    A::A() [base object constructor]
            mov     rax, QWORD PTR [rbp-8]
            add     rax, 8
            mov     rdi, rax
            call    B::B() [base object constructor]
            mov     edx, OFFSET FLAT:vtable for C+16
            mov     rax, QWORD PTR [rbp-8]
            mov     QWORD PTR [rax], rdx
            mov     edx, OFFSET FLAT:vtable for C+48
            mov     rax, QWORD PTR [rbp-8]
            mov     QWORD PTR [rax+8], rdx
            nop
            leave
            ret
    C::f():
            push    rbp
            mov     rbp, rsp
            mov     QWORD PTR [rbp-8], rdi
            nop
            pop     rbp
            ret
    C::h():
            push    rbp
            mov     rbp, rsp
            mov     QWORD PTR [rbp-8], rdi
            nop
            pop     rbp
            ret
    main:
            push    rbp
            mov     rbp, rsp
            sub     rsp, 16
            lea     rax, [rbp-16]
            mov     rdi, rax
            call    C::C() [complete object constructor]
            mov     eax, 0
            leave
            ret
    vtable for C:
            .quad   0
            .quad   typeinfo for C
            .quad   C::f()
            .quad   C::h()
            .quad   -8
            .quad   typeinfo for C
            .quad   B::g()
    vtable for B:
            .quad   0
            .quad   typeinfo for B
            .quad   B::g()
    vtable for A:
            .quad   0
            .quad   typeinfo for A
            .quad   A::f()
    typeinfo for C:
            .quad   vtable for __cxxabiv1::__vmi_class_type_info+16
            .quad   typeinfo name for C
            .long   0
            .long   2
            .quad   typeinfo for A
            .quad   2
            .quad   typeinfo for B
            .quad   2050
    typeinfo name for C:
            .string "1C"
    typeinfo for B:
            .quad   vtable for __cxxabiv1::__class_type_info+16
            .quad   typeinfo name for B
    typeinfo name for B:
            .string "1B"
    typeinfo for A:
            .quad   vtable for __cxxabiv1::__class_type_info+16
            .quad   typeinfo name for A
    typeinfo name for A:
            .string "1A"
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 3月4日
  • 已采纳回答 2月24日
  • 创建了问题 2月24日

悬赏问题

  • ¥15 基于双目测规则物体尺寸
  • ¥15 wegame打不开英雄联盟
  • ¥15 公司的电脑,win10系统自带远程协助,访问家里个人电脑,提示出现内部错误,各种常规的设置都已经尝试,感觉公司对此功能进行了限制(我们是集团公司)
  • ¥15 救!ENVI5.6深度学习初始化模型报错怎么办?
  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,