2014-03-24 44 views
0

我一直在嘗試使用VS2013繼承C++中的運算符。我有它實現幾種方法和一類B,其繼承A. A級還實現了一個運算符*,其與另一個C類相互作用的類A,是這樣的:繼承運算符的問題*

class A 
{ 
    ... 
    C operator*(const C &_objectC) {...} 
} 

class B: public A 
{ 
    ... 
} 

由於A和B之間不要的變化不會改變操作符*的實現,很高興從A繼承它而不是重新實現它。我一直在試圖這樣做,但是編譯器不能找到A.

實現下面的代碼操作:

B foo = ...; 
C bar = ...; 
C result = foo * bar; 

我有此錯誤:

error C2679: binary '*' : no operator found which takes a right-hand operand of type 'class C' (or there is no acceptable conversion) 

我知道operator =必須被重載,因爲編譯器總是爲每個類生成它的一個版本,所以你不能直接繼承它。

¿其他操作符是否可以繼承?我的理解是可能的,但我的編譯器不同意。 ¿有沒有我做錯的事情,或者我只需要重新實現操作員只調用父類的操作員?

在此先感謝。

+0

你使用什麼編譯器?我可以在VS 2013中編譯這個罰款。 (注意:我假設operator *是公開的,爲簡潔起見,這部分只是被省略)。 – Lilshieste

+0

您可以發佈一個不能編譯的實際示例?這適用於g ++。 – QuestionC

回答

0

聲明運營商作爲一個非成員函數,編譯器應編譯代碼。例如

C operator *(const A &, const C &); 

或者你可以宣佈該運營商的虛擬和在派生類中重新定義它。

也可以說運營商被宣佈爲A類私人?

+0

Re「是否可以將操作符聲明爲A類中的私有?」,如果它是私有的,那麼編譯器應抱怨不可訪問,而不是找不到。 –

+0

@乾杯和hth。 - Alf我同意。但是像往常一樣呈現的代碼片段甚至沒有編譯。:)看起來很難編寫一個簡單的代碼來重現問題。 –

2

下面的代碼,相當於你提出什麼(在寫這個答案的時間),只添加了分號和main功能填寫,工作原理:

class C {}; 

class A 
{ 
public: 
    auto operator*(C const &_objectC) const 
     -> C 
    { return C(); } 
}; 

class B: public A 
{ 
}; 

auto main() 
    -> int 
{ 
    B foo = B(); 
    C bar = C(); 
    C result = foo * bar; 
} 

因此,你沒有提供的代碼問題在哪裏。