3
#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に移動し、その関数を呼び出すことを読みましたか? しかし、これは実行時にどのように達成されるのでしょうか?

4

3 に答える 3