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