2013-10-06 63 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()方法即可。或者甚至让我模板化,如果你不想再为每个派生类型写它。