#include<iostream>
using namespace std;
class X
{
int a;
int b;
public:
void f(int a)
{
cout<<"\nInside X";
}
virtual void abc ()
{
cout<<"\nHello X";
}
};
class Y : public X
{
int a;
public:
void f(int a, int b)
{
cout<<"\nInside Y";
}
void abc()
{
cout<<"\nHello Y";
}
};
int main()
{
X a;
cout<<sizeof(X);
Y b;
cout<<sizeof(Y);
X *h = new Y;
h->abc();
}
クラス X のサイズが 12 バイトである理由は、仮想テーブルへの vptr (仮想ポインター) が含まれているためだと理解しています。とにかく、この仮想テーブルを読み取ることができますか。そうでない場合は、少なくとも仮想ポインターにアクセスできます。ユニオンを使用してみましたが、何らかのエラーが発生しました。
h
また、 h->abc() を呼び出すと、クラスのオブジェクトが指しているのをどのように知るのですか? これのほとんどはコンパイル時に行われると思いました。しかし、派生クラスを指す基本クラス ポインターがある場合、実行するクラス関数をどのように知るのでしょうか。この 2 つの状況を考慮してください
X *h = new X;
h->abc();/* This would call the abc function in X */
と
X *h = new Y;
h->abc();/* This would call the abc function in Y*/
h
私は、ポインターが指しているオブジェクトのvtableに移動し、その関数を呼び出すことを読みましたか? しかし、これは実行時にどのように達成されるのでしょうか?