c++ - vptr 和 vtable 是从基类继承的吗?

标签 c++ virtual-functions vtable vptr virtual-table

可以看出,D3 在继承链的中间引入了一个新的虚函数@function3()。我想知道发生这种情况时 *--vptr 和 vtable 发生了什么。 D3 现在是一种“某种”新的基类,

class Base {
public:
    virtual void function1() { std::cout << "Base func1()\n"; };
    virtual void function2() { std::cout << "Base func2()\n"; };
};

class D1 : public Base {
public:
    virtual void function2() { std::cout << "D1 func2()\n"; };
};

class D2 : public D1 {
public:
    virtual void function1() { std::cout << "D2 func1()\n"; };
};

class D3 : public D2 {
public:
    virtual void function2() { std::cout << "D3 func2()\n"; };
    virtual void function3() { std::cout << "D3 func3()\n"; };
};

class D4 : public D3 {
public:
    virtual void function1() { std::cout << "D4 func1()\n"; };
    virtual void function3() { std::cout << "D4 func3()\n"; };
};

int main() {
    D3 d3;  
}

https://imgur.com/a/sxFzrKG

但是当我看到 vtable 条目时,我能看到的是 function1()function2()。 我认为条目必须是 function2()function3()。 为什么我得不到我想的?

最佳答案

不清楚“正在发生的事情”是什么意思。所有 vtable 都是特定于类(类型)的。 D1vtable 不同于 D2 的 vtable,等等。

D3 的 Vtable 比 D1 有更多的功能。如果您的静态类型是 D3D4,您通常可以调用这些函数,但如果您的静态类型是 D1D2

关于c++ - vptr 和 vtable 是从基类继承的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57466697/

相关文章:

c++ - 无法在C++中打开头文件

c++ - 如何创建指向模板类的不同实例化的指针

c++ - 多个基类可以有相同的虚方法吗?

c++ - 为什么 Vtables 在嵌入式平台上没有被正确实现?

c++ - 在哪些情况下不会发生 vtable 构造?

c++ - 访问 std::pair 中的类型作为模板参数传递

c++ - 虚拟基类对象创建

c++ - 强制所有类在多级继承层次结构中实现/覆盖 'pure virtual' 方法

c# - 虚函数在 C# 和 Java 中如何工作?

c++ - 尝试编译简单测试程序时 CMake 失败