2

最近、ラッピングのために C++/Cli を使い始めました。今、私は内部についてもっと知らなければならないところまで来ています。

次のコードを検討してください。

Header file (ignoring .NET namespaces for this example):

public ref class BaseyClass
{
    protected:
        delegate void TestMethodDelegate(); // TestMethod delegate
        BaseyClass();                       // constructor            
        virtual void TestMethod();          // member: method
        GCHandle _testMethodHandle;         // member: method handle
};


CPP file (ignoring .NET namespaces for this example):

BaseyClass::BaseyClass()
{
    _testMethodHandle
          = GCHandle::Alloc(
                       gcnew TestMethodDelegate(this, &BaseyClass::TestMethod));
}

void TestMethod()
{
}

最終的に、このクラスは後で (DerivedClass の) 基本クラスとして使用され、メソッド "TestMethod()" がオーバーライドされ、デリゲート ポインターを介してアンマネージ コードから呼び出されます。

ここで質問: デリゲートによって参照されるメソッドはどれですか?

BaseyClass::TestMethod();

また

DerivedClass::TestMethod();

個人的には、「BaseyClass::TestMethod()」はデリゲートによって参照されると思います。これは、オーバーライドされた場合でも、デリゲートは BaseyClass の (ベース) アドレスを指すためです。したがって、DerivedClass は「TestMethod」をオーバーライドして BaseyClass からのデリゲートを使用することはできません。

確認したいだけです。コメントと啓発に感謝します。

4

1 に答える 1

1

デリゲートは、派生クラスの TestMethod への参照になります。を渡していますが、これは&BaseyClass::TestMethod仮想メソッドでthisあり、派生型である も渡しています。これらは両方とも、デリゲートの作成時に考慮されます。

その他の注意事項:

  • TestMethodDelegate は、クラス定義内にある必要はありません。より標準的な方法は、デリゲートをクラスの外、名前空間だけに置くことです。(または、既存の組み込みのものを使用しActionます。)
  • 必要はありませんGCHandle::Alloc(それが許可の意味だと思います)。代わりに(または)_testMethodHandleとして宣言します。一般に、アンマネージ コードとやり取りしていない限り、GCHandle を扱う必要はありません。このコードはすべてマネージされています。TestMethodDelegate^Action^

ここに私のテストコードがあります:

public ref class BaseyClass
{
public:
    BaseyClass() { this->_testMethodHandle = gcnew Action(this, &BaseyClass::TestMethod); }
    virtual void TestMethod() { Debug::WriteLine("BaseyClass::TestMethod"); }
    Action^ _testMethodHandle;
};

public ref class DerivedClass : BaseyClass
{
public:
    virtual void TestMethod() override { Debug::WriteLine("DerivedClass::TestMethod"); }
};


int main(array<System::String ^> ^args)
{
    BaseyClass^ base = gcnew DerivedClass();
    base->_testMethodHandle();
    return 0;
}

出力:

DerivedClass::TestMethod

于 2012-12-13T17:54:15.530 に答える