我有幾個類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