我有几个类d与以下形式的公共部分:如何与一个协变参数来覆盖的函数(在一个抽象基类)
class D
{
public:
D& foo();
void bar(D&);
}
我想建立一个单一的抽象类从该他们都从中得到。
我的(幼稚)的尝试是:
// in .h file
class B
{
public:
virtual B& foo() = 0;
virtual void bar(B&) = 0;
}
class D : public B
{
public:
D& foo() override;
void bar(D&) override;
}
// in .cpp file
D& D::bar() {return *(new D());}
void D::foo(D& d) {}
这未能编译(我最终意识到是)一个相当合理的理由:任何功能覆盖
void bar(B&)=0;
必须定义函数用于任何参考类型B的参数。所提供的候选
virtual void bar(D&) override;
仅针对参考类型D的参数(较小的集合)定义。
请注意,这对函数foo不是问题。事实上,如果你用条注释掉这三行,所有的东西都编译得很好。
我认为这种现象的技术解释是C++不支持参数的协方差(但它确实支持参数中的协变性)。
答案后C++ covariance in parameters表明,我不能为我的类定义的接口(即抽象类)D.
有一些简单的或常规的方法来创建所有单“界面”我的班D?或者,也许隐藏这些类的不同实现有不同的设计模式。
在此先感谢您的意见和建议。
和
没有什么像'协变参数'。返回类型可能是协变的。 –
必须在派生类中使用在基类中声明的***精确***签名来实现纯虚拟成员函数。 –
@πάνταῥεῖ允许协变返回类型。 – NathanOliver