c++交叉协变:由于类型不完整,返回类型不同



我正在试验协方差,并提出了以下示例,该示例至少不使用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());
}

相关内容

  • 没有找到相关文章

最新更新