我有这样一段代码(从我的现实生活中的麻烦做作)使用子类型参数
它不能编译,抱怨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++允许改变返回类型的子类,而不是参数类型?
这是一个很好的基本原理还是语言规范中的一个错误点?
对于该规则,参数不需要匹配100%。虽然*协变参数*会违反该规则,但是反变量参数不会破坏它(每个可以传递给基的参数也可以传递给派生类型),它们也是不允许的。部分原因是x方差不是免费的,必须由蹦床/ thunk来处理返回的参数(在协方差的情况下)。允许参数中的反差会大大(按指数规律?)增加所需的蹦床功能数量和虚拟表的大小。 –