私はこのコードを持っています(私の現実の問題から考案されました)
ExtendsB が実装されていないと不平を言って、コンパイルできませんB::Run(A* a)
。ただし、拡張を理解するのに問題はありませんA* Run();
class A { };
class ExtendsA : public A { };
class B
{
public:
virtual ~B(){}
virtual void Run(A* a) = 0;
virtual A* Run() = 0;
};
class ExtendsB : public B
{
public:
virtual ~ExtendsB(){}
// Not OK! It does not see it as an implementation of
// virtual void Run(A* a) = 0;
virtual void Run(ExtendsA* ea) {};
virtual ExtendsA* Run() { return new ExtendsA(); }; // OK
};
C++ で戻り値の型をサブクラスに変更できるのに、パラメーターの型を変更できないのはなぜですか?
それは正当な理由ですか、それとも言語仕様の見落としですか?