3

以下のようなクラスClassA実装インターフェースがありますIFooBar

class ClassA : public Microsoft::WRL::RuntimeClass<IFooBar>
{
public:
    virtual HRESULT RuntimeClassInitialize(ParamsForClassA);
}

今、私はClassB固有のものを書き、以下のような関数ClassAをオーバーライドしたいと思います:RuntimeClassInitialize

class ClassB : public ClassA
{
public:
    HRESULT RuntimeClassInitialize(ParamsForClassB)
    {
        // implementation goes here
    }
}

そして、次のClassBようなオブジェクトへのポインターを作成します。

ComPtr<ClassB> ptr;
HRESULT hr = MakeAndInitialize<ClassB>(&ptr, ParamsForClassB);

しかし、これは実際にはClassARuntimeClassInitializeコンストラクターに渡されます。のコード パスがヒットすることはありませんClassBRuntimeClassInitialize

これが WRL でクラスを拡張する正しい方法であるかどうか疑問に思っていますか? コードのどこが間違っていますか?

4

1 に答える 1

3

オーバーライドされたメソッドが両方のクラスで同じ署名を持つ必要があります。

これ

HRESULT RuntimeClassInitialize(ParamsForClassA);

これでオーバーライドすることはできません

HRESULT RuntimeClassInitialize(ParamsForClassB);

彼らは異なる議論を取るからです。
これはoverloadであり、overrideではありません。(そして、そのようなオーバーロードはName Hidingを引き起こします)

署名に関する情報は、こちらまたはこちらでご覧いただけます

于 2014-08-12T09:34:31.423 に答える