プライベート仮想関数
更新 : 2007 年 11 月
派生クラス内でのプライベート仮想関数の処理方法は、Visual C++ 2008 では C++ マネージ拡張から変更されています。
マネージ拡張では、仮想関数のアクセス レベルによって派生クラス内でのオーバーライドが制限されることはありませんでした。新しい構文では、仮想関数は自身がアクセスできない基本クラスの仮想関数をオーバーライドできません。この例を次に示します。
__gc class Foo {
// inaccessible to a derived class
virtual void g();
};
__gc class Bar : public Foo {
public:
// in Managed Extensions, ok: g() overrides Foo::g()
// in new syntax, error: cannot override: Foo::g() is inaccessible …
void g();
};
このようなデザインから新しい構文への実際の対応付けはありません。基本クラス メンバにアクセスできるようにする、つまり基本クラス メンバを非プライベートに設定する必要があります。継承するメソッドが同じアクセスを持つ必要はありません。この例で、最も影響の少ない変更は、Foo メンバを protected に設定することです。この場合、Foo を介してのメソッドへの一般的なプログラムのアクセスは禁止されたままです。
ref class Foo {
protected:
virtual void g();
};
ref class Bar : Foo {
public:
virtual void g() override;
};
新しい構文では、基本クラスに virtual キーワードが明示的に指定されていないと、警告メッセージが生成されます。