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"
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥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之后自动重连失效