vptr 和 vtable 是从 base class 继承的吗?
are vptr and vtable inherited from base class?
可以看出,D3
在继承链的中间引入了一个新的虚函数@function3()
。我想知道发生这种情况时 *--vptr 和 vtable 发生了什么。 D3现在是'kind of'一个新基地class,
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;
}
但是当我看到 vtable 条目时,我能看到的是 function1()
、function2()
。
我认为条目必须是 function2()
、function3()
。
为什么我得不到我想的?
不清楚 'what is happening' 是什么意思。所有 vtable
都特定于 class(类型)。 D1
的 vtable
不同于 D2
的 vtable,等等。
D3
的 Vtable 比 D1
有更多的功能。如果您的静态类型是 D3
或 D4
,您通常可以调用这些函数,但如果您的静态类型是 D1
或 D2
.[=20=,则不能调用这些函数]
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)
调试器没有显示所有这些的原因可能是错误或限制。
可以看出,D3
在继承链的中间引入了一个新的虚函数@function3()
。我想知道发生这种情况时 *--vptr 和 vtable 发生了什么。 D3现在是'kind of'一个新基地class,
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;
}
但是当我看到 vtable 条目时,我能看到的是 function1()
、function2()
。
我认为条目必须是 function2()
、function3()
。
为什么我得不到我想的?
不清楚 'what is happening' 是什么意思。所有 vtable
都特定于 class(类型)。 D1
的 vtable
不同于 D2
的 vtable,等等。
D3
的 Vtable 比 D1
有更多的功能。如果您的静态类型是 D3
或 D4
,您通常可以调用这些函数,但如果您的静态类型是 D1
或 D2
.[=20=,则不能调用这些函数]
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)
调试器没有显示所有这些的原因可能是错误或限制。