如何解決以下衝突?定義將抽象類的所有派生類作爲參數的函數
定義一個返回Abstract的Abstract []中的運算符[]。我想讓函數f使用該方法。但是,這不起作用,因爲DerivedA的相應運算符[]應該返回DerivedA。然後,Abstract的operator []的返回類型和DerivedA的operator []的返回類型不是協變的。
未定義Abstract中的方法。現在函數f不能建立在Abstract的方法上。可能這意味着必須爲Abstract的所有派生類中的每一個編寫多個版本的f。
經過一段時間,我意識到我可以enable_if參數有一定的特質,並簡單地擺脫了抽象類。有其他可能的解決方案嗎?
代碼:
class Abstract{
protected:
int val;
public:
//virtual Abstract operator[](int i){} //forget about this.
virtual ~Abstract(){}
};
class DerivedA : public Abstract{
public:
DerivedA(){
val = 0;
}
DerivedA operator[](int i){
DerivedA temp;
temp.val = val + i;
}
};
class DerivedB : public Abstract{
public:
DerivedB(){
val = 0;
}
DerivedB operator[](int i){
DerivedB temp;
temp.val = val*2 + i;
}
};
template <typename T>
//some enable_if here to limit type T to
//DerivedA or DerivedB.
T f(T & X){
return X[1];
}
/*
Abstract f(Abstract & X){
return X[1];
} //forget about this again.
*/
int main(void){
DerivedB B;
DerivedA A;
f(B);
f(A);
}
** - 1 **這是**不是真實的代碼**。 –
「下面的代碼完全不起作用」 - 不是很大一部分是由於語法錯誤,邏輯錯誤和缺失標識符過多造成的。給自己一個戰鬥機會,並至少解決這些問題。 – WhozCraig
我認爲如果愚蠢的非實際代碼示例被忽略,這可以歸結爲協變函數模板的問題,C++不支持它作爲成員函數。 –