私は VS 2013 を使用しており、vptr と vftable がオブジェクト レベルでどのように機能しているかを確認しようとしています。だから私は次のクラスを持っています:
#include<iostream>
using namespace std;
class baseClass
{
public:
void nonVirtualFunc() {}
virtual void virtualNonOverriddenFunc() {}
virtual void virtualOverriddenFunc() {}
};
class derivedClass : public baseClass
{
public:
virtual void virtualOverriddenFunc() {}
virtual void derivedClassOnlyVirtualFunc() { cout << "derivedClass" << endl; }
};
int main(int argc, char** argv) {
derivedClass derivedClassObj2;
cout << "Size of derivedClassObj: " << sizeof(derivedClassObj2) << endl;
return 0;
}
そして、これはデバッグ時に私が見るものです:
理論的には、2 つの vptr が必要です。1 つは baseClass の vftable 用で、もう 1 つは新たに追加された derivedClassOnlyVirtualFunc() を追跡するための派生クラス用です。
しかし、ご覧のとおり、vptr/vftable は 1 つしかありません。しかし、メカニズムは正常に動作します。
ウォッチウィンドウに見えない 2 番目の vptr があると思ったので、オブジェクトのサイズを出力しました。これは 4 バイトであり、ポインターが 1 つだけ存在することを示します。
では、これは新しく追加された仮想機能でどのように機能するのでしょうか?
これによれば、2 つの vptr があるはずです。
編集:Sergeが提案したように、vftableのメモリ内容を確認しましたが、実際には3つのエントリがあります。
何らかの理由で、デバッガーに表示されません。
乾杯。