我正在试验协方差,并提出了以下示例,该示例至少不使用clang 11和VS2015进行编译:
class Number {
public:
virtual ~Number () = default;
virtual Number const * increment()const = 0;
};
class Even;
class Odd : public Number {
public:
// error: increment() is not covariant because Even is incomplete
Even const * increment()const;
};
class Even : public Number {
public:
Odd const * increment()const;
};
它与协变返回类型、常量和不完整类有关,但不是重复的,因为两个重写函数的常量相同。
这甚至得到了标准的支持吗?
有没有办法解决这个问题,或者有什么建议可以实现类似的行为?
虽然您试图实现的目标可能有变通方法,但显示的代码无效。
根据类别。虚拟#9:
如果D的协变返回类型中的类类型::f与B不同::f、 D的返回类型中的类类型::f在D声明时应完整::f或应为D类…
链接文本中有此规则的示例。
在您的情况下,由于Odd::increment
的返回类型不是Number
,并且Even
在声明Odd::increment
时是不完整的,因此代码格式不正确。
我发现这个答案不正确,因此删除了@Brian在回复你链接的问题时写的答案。
您可以使用非虚拟接口实现类似的功能(尽管它有更多的行,看起来更容易出错(:
class Number {
public:
virtual ~Number() = default;
Number const * increment() const { return do_increment(); }
private:
virtual Number const * do_increment() const = 0;
};
class Even;
class Odd : public Number {
public:
Even const * increment() const;
private:
Number const * do_increment() const override;
};
class Even : public Number {
public:
Odd const * increment() const { return do_increment(); }
private:
Odd const * do_increment() const override;
};
inline Even const * Odd::increment() const {
return static_cast<Even const *>(do_increment());
}