2013-12-18 71 views
1

我有一個基本calss和2個派生類。我想實現一些乘法運算符,它可以用來乘以這兩個類的對象。多個派生類之間的C++運算符重載

class Base 
{ 
public: 
    virtual ~Base() {} 
    virtual void print() = 0; 

    Base operator * (Base & b1, Base & b2) { return b1 * b2; } <---- this wont work because of pure virtual function 
}; 

class D2; 

class D1 : public Base 
{ 
public: 
    void print() { ....} 
    D1 operator * (D1 & d) {//do some operation here} 
    D1 operator * (D2 & d) {//same as above...} 

private: 
    int i; 
}; 

class D2 : public Base 
{ 
public: 
    void print() { ....} 
    D2 operator * (D1 & d) { ..... } 
    D2 operator * (D2 & d) { ..... } 

private: 
    double j; 
    double m; 
}; 

這是我最初的設計,但我知道它不是去工作,所以我會 什麼是實現一個很好的設計?有沒有辦法使用模板來實現這一點? 謝謝!

+2

你有沒有考慮過一個外部'operator *'這不是兩個類的方法,但可能是兩個朋友? –

回答

1
Base operator * (Base & b1, Base & b2) { return b1 * b2; } \ 

//這將給出編譯錯誤。

你是否想要從第三個對象乘以兩個完全不同的對象?其實這沒有任何意義。當運算符使用非成員函數進行重載時,將使用此函數原型。

因此,對於你的類,你也可以使用,

Base operator * (Base & b2) { return *this * b2; } 

//提供你的函數類不是抽象的。

這基本上擴展爲這個 - >操作符*(B2)

現在來,

D1 operator * (D1 & d) {//do some operation here} 
D1 operator * (D2 & d) {//same as above...} 

爲什麼這行?爲什麼你需要兩個功能?

您可以使用轉換函數從一種類型的對象進行轉換,然後反轉 ,然後只有一個重載的運算符*可以完成您的工作。

雖然,代碼量將幾乎是相同的,但至少會看起來更清潔 。

你也可以使用模板,但爲此你必須有一個通用的操作符重載實現。 這可以通過使用轉換函數來實現,因爲那樣你就會有通用代碼來實現operator *函數。

請讓我知道我是否完全誤解了您的問題,或者我的方向完全相反。