我有这段代码(从我现实生活中的麻烦中设计出来的)
它无法编译,抱怨 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++ 允许将返回类型更改为子类,而不是参数类型?
这是一个很好的理由还是只是语言规范中的一个遗漏点?