インターフェイス メンバの明示的なオーバーライド
更新 : 2007 年 11 月
クラス内のインターフェイス メンバの明示的なオーバーライドを宣言する構文が C++ マネージ拡張から Visual C++ 2008 に変更されました。
インターフェイスを実装するインターフェイス メンバのインスタンスをクラス内に 2 つ作成すると便利です。1 つのインスタンスは、クラス オブジェクトがインターフェイス ハンドル経由で操作される場合に使用されます。もう 1 つのインスタンスは、クラス オブジェクトがクラス インターフェイス経由で使用される場合に使用されます。この例を次に示します。
public __gc class R : public ICloneable {
// to be used through ICloneable
Object* ICloneable::Clone();
// to be used through an R
R* Clone();
};
マネージ拡張では、これを実現するために、インターフェイス名で修飾されたメソッド名を持つインターフェイス メソッドを明示的に宣言します。クラスに固有のインスタンスは修飾されません。このようにすることで、この例では、R のインスタンス経由で Clone が明示的に呼び出されたときに、その戻り値をダウンキャストする必要がなくなります。
新しい構文では、マネージ拡張の構文に代わって、一般的なオーバーライド機構が導入されています。上記の例は次のように書き換えることができます。
public ref class R : public ICloneable {
public:
// to be used through ICloneable
virtual Object^ InterfaceClone() = ICloneable::Clone;
// to be used through an R
virtual R^ Clone();
};
このように変更するには、明示的にオーバーライドされるインターフェイス メンバにクラス内で一意の名前を指定する必要があります。この例では、InterfaceClone という不適切な名前を指定しています。動作はこれまでと同じで、名前を変更した InterfaceClone, が ICloneable インターフェイス経由で呼び出されます。一方、R 型のオブジェクト経由の呼び出しでは、2 つ目の Clone インスタンスが呼び出されます。