#include <iostream>
using namespace std;
class Base {
public:
Base() {
cout << "In Base" << endl;
cout << "Virtual Pointer = " << (int*)this << endl;
cout << "Address of Vtable = "
<< (int*)*(int*)this << endl;
cout << "Value at Vtable = "
<< (int*)*(int*)*(int*)this << endl;
cout << endl;
}
virtual void f1() { cout << "Base::f1" << endl; }
};
class Drive : public Base {
public:
Drive() {
cout << "In Drive" << endl;
cout << "Virtual Pointer = "
<< (int*)this << endl;
cout << "Address of Vtable = "
<< (int*)*(int*)this << endl;
cout << "Value at Vtable = "
<< (int*)*(int*)*(int*)this << endl;
cout << endl;
}
virtual void f1() { cout << "Drive::f2" << endl; }
};
int main() {
Drive d;
return 0;
}
このプログラムの出力は
In Base
Virtual Pointer = 0012FF7C
Address of Vtable = 0046C08C
Value at Vtable = 004010F0
In Drive
Virtual Pointer = 0012FF7C
Address of Vtable = 0046C07C
Value at Vtable = 00401217
コードに従ってください。Drive オブジェクトを作成すると、Base コンストラクターも実行され、Drive の仮想ポインターと同じ仮想ポインターのアドレスが表示されることがわかります: 0012FF7C。奇妙なことに、Base クラスと Drive クラスの両方のコンストラクターでそのアドレスを逆参照すると、異なる値が指され、1 つは 0046C08C に、もう 1 つは 0046C07C に 2 つの vtable があることを意味します。Drive オブジェクトの構造と、1 つのポインターが 2 つのアドレスを指している場合の言語を理解するのは非常に困難です。