我繼承了兩個類,TFoamIntegrand和IBaseFunctionMultiDim,它們都是抽象類。我遇到的問題是我希望能夠使用克隆成員函數,該函數對於IBaseFunctionMultiDim是一個沒有參數的純虛擬,對於TFoamIntegrand,它不是TFoamIntegrand中的純虛擬,而是具有參數(具有默認值)。C++多繼承,虛方法重載問題和協變返回類型
class TObject {
public:
virtual TObject *Clone(const char *newname="") const;
...
};
class TFoamIntegrand : public TObject {
public:
virtual Double_t Density(Int_t ndim, Double_t *) = 0;
...
};
class IBaseFunctionMultiDim {
public:
/**
Clone a function.
Each derived class must implement his version of the Clone method
*/
virtual IBaseFunctionMultiDim * Clone() const = 0;
...
}
我可以把它編譯的唯一方法就是要做到:
class InSANEDiffXSec : public TFoamIntegrand, public ROOT::Math::IBaseFunctionMultiDim {
public:
virtual ROOT::Math::IBaseFunctionMultiDim* Clone() const ;
...
}
當然,這產生大約隱藏克隆與參數的警告。我已經嘗試了以下,但我得到協變返回類型錯誤。
virtual ROOT::Math::IBaseFunctionMultiDim* Clone(const char * newname = "") const ;
virtual InSANEDiffXSec* Clone(const char * newname = "") const ;
根據我對協變返回類型的理解,我認爲上面的最後一個版本是正確的。我在這裏錯過了什麼?
在此先感謝!
編輯:這是一個完整的例子:
class A {
public:
virtual A* Clone(const char * name="") { return(new A());}
};
class B {
public:
virtual B* Clone() = 0;
};
class C : public A {
public:
virtual double Density(int ndim, double *) = 0;
};
class D : public C, public B {
public:
virtual double Density(int ndim, double *x) {
return 0.0;
}
//virtual D* Clone(const char * name="") { return(new D());}
virtual B* Clone() { return(new D());}
};
它編譯。更改爲註釋行給出:
test.h: In member function ‘virtual D* D::Clone(const char*)’:
test.h:24:62: error: cannot allocate an object of abstract type ‘D’
virtual D* Clone(const char * name="") { return(new D());}
^
test.h:19:7: note: because the following virtual functions are pure within ‘D’:
class D : public C, public B {
^
test.h:11:17: note: virtual B* B::Clone()
virtual B* Clone() = 0;
^
test.cxx: In function ‘int main()’:
test.cxx:7:18: error: cannot allocate an object of abstract type ‘D’
D * d = new D();
^
In file included from test.cxx:2:0:
test.h:19:7: note: since type ‘D’ has pure virtual functions
class D : public C, public B {
請閱讀http://sscce.org並將其應用於您的問題。擺脫殘酷! – Yakk
我有很多鏈接來編寫有據可查的代碼,但我只能發佈一個鏈接,因爲我在這個網站上缺乏聲譽。 – whit2333
我要求*少代碼*不多。請閱讀http://sscce.org – Yakk