3

このクラスがあると仮定します:

class Shape
{
public:
    int value;

    Shape(int v) : value(v) {};

    void draw()
    {
        cout << "Drawn the element with id: " << value << endl;
    }
};

および次のコード(動作します)

    Shape *myShapeObject = new Shape(22);

    void (Shape::*drawpntr)();
    drawpntr = &Shape::draw;

    (myShapeObject ->*drawpntr)();

クラス Shape の void を返す引数 0 の関数メンバーへの drawpntr 関数ポインタがあります。

まずお聞きしたいのは:

drawpntr = &Shape::draw;

関数はメンバー関数で、ここにはオブジェクトがありません.. drawpntr はどのアドレスを受け取りますか? クラスは存在すらすべきではありません

ラインに同意します

(myShapeObject->*drawpntr)();

メンバー関数への関数ポインターを逆参照できないことを理解しているため(オブジェクトなし->関数なし)、drawpntrに実際に格納されているアドレスは何ですか?? オブジェクトがないとき

drawpntr = &Shape::draw;

行が呼び出されます..クラスはエンティティとしても存在してはなりません

4

1 に答える 1

8

すべてのメンバー関数は同じコードを共有するため、メモリのコード セグメント内で同じアドレスを持ちます。thisメンバー関数は、異なる値のポインターが暗黙的に渡されるという理由だけで、異なるインスタンスで動作します。これらは、操作対象のインスタンスとはまったく関係がありません。の実際の値はdrawpntr、関数が非仮想の場合は静的に決定でき、関数が仮想の場合は ( vtableを介して) 動的に決定できます。

于 2012-10-07T01:06:15.777 に答える