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日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效