在 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/