C++ vptr和vtable是否从基类继承? 可以看到, d3在继承链的中间引入了一个新的虚函数, @函数3>(代码>。我想知道发生这种情况时,*--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; } 类基{ 公众: 虚空函数1(){std::cout
不清楚“发生了什么”是什么意思。所有C++ vptr和vtable是否从基类继承? 可以看到, d3在继承链的中间引入了一个新的虚函数, @函数3>(代码>。我想知道发生这种情况时,*--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; } 类基{ 公众: 虚空函数1(){std::cout,c++,virtual-functions,vtable,vptr,virtual-table,C++,Virtual Functions,Vtable,Vptr,Virtual Table,不清楚“发生了什么”是什么意思。所有vtables都特定于类(类型)。D1的vtable与D2的vtable不同,依此类推 D3的Vtable中的函数比D1多。如果静态类型为D3或D4,则通常可以调用这些函数,但如果静态类型为D1或D2,则无法调用这些函数。Vtable包含所有继承的虚拟函数和任何新引入的虚拟函数。 以下是MSVC生成的D3 vtable: const D3::`vftable' DD FLAT:const D3::`RTTI Complete Object Locator'
vtable
s都特定于类(类型)。D1
的vtable
与D2
的vtable不同,依此类推
D3
的Vtable中的函数比D1
多。如果静态类型为D3
或D4
,则通常可以调用这些函数,但如果静态类型为D1
或D2,则无法调用这些函数。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)
调试器没有显示所有这些文件的原因可能是一个错误或限制。注意:vptr/vtable是实现细节。实现不必使用它们来实现虚拟分派(尽管大多数都使用)-如果他们愿意,他们可以自由地使用其他方法来实现标准的强制行为。编译器也可以自由地省去代码,因为它可以证明这些代码从来都不是真正需要的。添加调用d3.function1()、d3.function2()和d3.function3()的代码。检查反汇编。您看到了什么?调试器可能只显示了两个条目,因为Base
只有两个条目。function3
将有一个未显示的附加条目(或者可能在窗口底部下方;检查滚动条).Unrelated:一旦一个函数被声明为virtual
它在所有派生类()中都是虚拟的。这对您来说意味着您不必重复virtual
。但是,在派生类中使用这些虚拟方法很方便。您能告诉我如何使用MSVC生成vtable吗?