2

我有一个名为变量的基类:

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

我有几个派生类,例如 Int、Bool、String 等。例如:

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();,但它没有帮助。

有什么建议么?我必须为此使用强制转换吗?

非常感谢...

4

2 回答 2

1

不能通过返回类型重载。我认为模板在您的情况下会更好。这里不需要多态性或继承:

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();
};

用法很简单

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';
于 2013-10-06T13:34:35.683 回答
0

类型在编译时确定。因此,再多的多态性也不允许您更改返回类型。
虚拟调度是在运行时完成的,但方法和对象的类型必须正确且在编译时相同。

如果只需要打印值,只需添加虚拟 ToString() 方法。如果您不想为每个派生类型再次编写它,甚至可以让 i 模板化。

于 2013-10-06T13:34:44.417 回答