class A {
virtual A* foo() = 0;
};
template<class T>
class B : public A {
virtual T* foo() { return nullptr; }
};
class C : public B<C> {
};
这是混合复合模式和奇怪重复的模板模式的可能性的简化实现。我收到以下错误:
Return type of virtual function 'foo' is not covariant with the return type of the function it overrides ('C *' is not derived from 'A *')
在 clang 3.0、gcc 4.7 和 Visual Studio 2008 上测试。
第一个解决方案:
class C : public A, public B<C> {}
在 Visual Studio 下编译,并警告 B 已经是 A 的子级,并且不会在clang 下编译并出现初始错误。
另一种解决方法:
class D : public A {}
class C : public B<D> {}
解决了不完整性问题,但我无法弄清楚我将拥有多少个 A 实例。直觉告诉我 A 是虚拟的,因此应该只有一个。
此解决方法还会创建不可读的代码。
标准对这种情况有何规定?这段代码应该编译吗?如果不是,为什么?