Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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吗?