次のコードは、Visual Studio 2005 ではコンパイルできません。
class OriginalClass
{
public:
class Delegate
{
virtual void original_func()=0;
};
};
class BaseClass
:public OriginalClass::Delegate // Problem line 1
{
public:
class Delegate
{
virtual void base_func(int x) = 0;
};
void original_func()override{} // Problem line 2
};
class DerivedClass : public BaseClass::Delegate
{
public:
virtual void base_func(int x) override {};
};
int main ()
{
DerivedClass derived_object;
derived_object.base_func(10);
}
ビルド出力は次のとおりです。
1>inherit\main.cpp(26) : error C3668: 'DerivedClass::base_func' : method with override specifier 'override' did not override any base class methods
1>inherit\main.cpp(32) : error C2259: 'DerivedClass' : cannot instantiate abstract class
1> due to following members:
1> 'void OriginalClass::Delegate::original_func(void)' : is abstract
1> inherit\main.cpp(7) : see declaration of 'OriginalClass::Delegate::original_func'
問題の行 1と問題の行 2とマークされた行をコメントアウトすると、正常にビルドされます。したがって、オーバーライドの使用は問題ではなく、ネストされたクラスからの継承でもありません。どの Delegate クラスを使用するのが正しいかを判断するのは難しいようです。
この問題は VC2008 には存在しません。
誰でもこれに対する回避策を提案できますか? 明らかなことに加えて、最新のコンパイラにアップグレードしてください!
また、誰かがバグのドキュメントを指摘できれば幸いです (バグの場合)。
編集: @Anonymous Coward は typedefs を使用することを提案しました。OriginalClass が次のように変更された場合にコンパイルされます。
class OriginalClass
{
public:
class Delegate_t
{
virtual void original_func()=0;
};
typedef Delegate_t Delegate;
};