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

标签 c++ multiple-inheritance vtable memory-layout vptr

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

相关文章:

c++ - 指向不同地址的虚表和函数指针

c++ - 函数指针(类内)

c++ - 混合基类的虚拟和非虚拟继承

c++ - 为什么 C++ 编译器不能区分继承的公共(public)方法和继承的同名私有(private)方法?

c++ - 如果有虚方法,是否要创建vtable?

c++ - vtables 和 this 指针

c++ - 无法访问派生类方法

c++ - 如何通过cout将字符输出为整数?

C++ 重载函数和隐式转换

c++多重继承 - 编译器修改我的指针