У меня есть этот кусок кода (ухитрившийся от моей реальной проблемы)
Он не может скомпилировать, жалуясь, что 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
};
Почему С++ позволяет изменить тип возвращаемого значения на подкласс, но не тип параметра?
Это хорошее обоснование или просто пропущенная точка в спецификациях языка?