0

可以看出,在继承链的中间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()。为什么我不能得到我的想法?

4

2 回答 2

1

不清楚你所说的“正在发生的事情”是什么意思。所有vtables 都特定于类(类型)。vtableforD1与 vtable for 不同D2,依此类推。

Vtable for 的D3功能不止D1一个。如果您的静态类型是or ,您通常可以调用这些函数,但如果您的静态类型是D3or D4,则不能调用这些函数。D1D2

于 2019-08-12T19:28:51.180 回答
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)

调试器没有显示所有这些的原因可能是错误或限制。

于 2019-08-12T20:17:42.143 回答