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

时间:2019-08-12 18:50:45

标签: 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()。 为什么我不能得到我的想法?

2 个答案:

答案 0 :(得分:1)

不清楚“发生了什么”的意思。所有vtable都特定于类(类型)。 vtable的{​​{1}}与D1的vtable不同,依此类推。

D2的Vtable具有比D3更大的功能。如果您的静态类型为D1D3,通常可以调用这些函数,但是如果您的静态类型为D4D1,则不能调用这些函数。

答案 1 :(得分:0)

vtable包含所有继承的虚函数和任何新引入的虚函数。

这是MSVC生成的D3的vtable:

const D3::`vftable' DD  FLAT:const D3::`RTTI Complete Object Locator'  ; D3::`vftable'
        DD      FLAT:virtual void D2::function1(void)
        DD      FLAT:virtual void D3::function2(void)
        DD      FLAT:virtual void D3::function3(void)

调试器未显示全部内容的原因可能是错误或限制。