我正在试验协方差并提出以下示例,该示例至少不能使用 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;
};
Run Code Online (Sandbox Code Playgroud)
它与协变返回类型、常量性和不完整类有关,但不是重复的,因为在两个被覆盖的函数中常量性是相同的。
这甚至得到标准的支持吗?
有没有办法解决这个问题或任何建议来实现类似的行为?
虽然可能有您想要实现的解决方法,但显示的代码无效。
如果 D?::?f 的协变返回类型中的类类型与 B?::?f 的不同,则 D?::?f 的返回类型中的类类型应在声明点完成D?::?f 或应为类类型 D. ...
链接文本中有此规则的示例。
在您的情况下,由于 的返回类型Odd::increment不是Number,并且Even在声明时不完整Odd::increment,因此代码格式错误。
我在这个不正确的答案中找到了答案,因此删除了@Brian 针对您链接到的问题所写的答案。