gpt4 book ai didi

c++ - 多继承中vtable c++中保存的重写虚方法在哪里

转载 作者:太空宇宙 更新时间:2023-11-04 13:28:16 25 4
gpt4 key购买 nike

在 C++ 中,在运行时没有类表示,但我总是可以在派生类中调用重写的虚方法。 vtable 中保存的重写方法在哪里?这是一段代码来演示:

struct B1 {
virtual void f() { ... }
};
struct B2 {
virtual void f() { ... }
virtual void g() { ... }
};
struct D : B1, B2 {
void f() { ... }
virtual void h() { ... }
};

D 类对象的内存布局是怎样的? B1::f 和 B2::f 保存在那个内存布局中的什么位置(如果它们被保存的话)?

最佳答案

D 类的对象 d 将只有一个指向 VMT 的指针D 类,它将包含一个指向 D::f 的指针。由于 B1:f 和 B2::f 只能从 D 类的范围内静态调用,因此对象 d 无需保留指向那些重写方法的动态指针。

这当然没有在标准中定义,这只是编译器的通常/逻辑实现。

事实上,情况要复杂得多,因为 D 类的 VMT 合并了 B1 和 B2 类的 VMT。但是无论如何,在创建 B1 类的对象之前,不需要动态调用 B1::f。

关于c++ - 多继承中vtable c++中保存的重写虚方法在哪里,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32548761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com