2013-10-06 65 views
2

我有一個基類命名的變量基類功能:重寫與不同的返回類型

class Variable 
{ 
protected: 
    std::string name; 
public: 
    Variable(std::string name=""); 
    Variable (const Variable& other); 
    virtual ~Variable(){}; 
}; 

我有幾個派生類,如int,布爾,字符串等。例如:

class Bool: public Variable{ 
private: 
    bool value; 

public: 
    Bool(std::string name, bool num); 
    ~Bool(); 
    Bool (const Bool& other); 
    bool getVal(); 

每個派生類都有一個名爲getVal()的方法,它返回一個不同的類型(bool,int等)。我想允許變量類的多態行爲。
我試過:void getVal();這似乎是錯誤的,編譯器顯示錯誤:shadows Variable::getVal()這聽起來不好。 我想到使用template <typename T> T getVal();但它沒有幫助。

有什麼建議嗎?我必須使用鑄造嗎?

非常感謝......

+0

顯示您在基座嘗試什麼和派生類 –

+0

'可變條件= condition_statement.evaluate(類型);' //其中'condition_statement.evaluate(類型)'返回一個布爾對象 'COUT << condition.getval ();' 編譯器說:「'類變量'沒有名爲'getVal'的成員」 – Shakedk

+1

請注意,您只能擁有**協變返回類型**,否則您會隱藏基類函數,這不是你想要的行爲。 –

回答

1

can't overload by return type。我認爲模板在你的情況下會更好。沒有必要對多態性或繼承的位置:

template<class T> 
class Variable { 
protected: 
    T value; 
    std::string name; 
public: 
    Variable(std::string n, T v); 
    Variable (const Variable& other); 
    virtual ~Variable(){}; 
    T getVal(); 
}; 

的用法是pretty simple

Variable<bool> condition("Name", true); 
Variable<char> character("Name2", 'T'); 
Variable<unsigned> integer("Name3", 123); 
std::cout << condition.getVal() << '\n'; 
std::cout << character.getVal() << '\n'; 
std::cout << integer.getVal() << '\n'; 
+0

謝謝你。但我需要不同的派生類(例如Bool,String,Int,Float等)將具有不同的運算符重載行爲。假設我需要Int來重寫operator +並最終添加值,但是如果Bool + Bool被嘗試,Bool應該拋出一個異常。我如何使用模板做到這一點? – Shakedk

+0

@Shakedk,這不是問題。只需使用[模板專業化](http://www.cprogramming.com/tutorial/template_specialization.html)。 – Shoe

+0

看起來有點複雜,但我會試一試。謝謝! – Shakedk

0

的類型在編譯時確定的。所以沒有多少的多態性可以讓你改變返回類型。
虛擬調度是在運行時完成的,但方法和對象的類型必須正確且編譯時相同。

如果您只需要打印該值,只需添加虛擬ToString()方法即可。或者甚至讓我模板化,如果你不想再爲每個派生類型寫它。