我有一个名为Variable的基类:
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();
,但没有帮助。
有什么建议吗?我必须使用铸造吗?
非常感谢......
答案 0 :(得分: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';
答案 1 :(得分:0)
类型在编译时确定。因此,任何数量的多态都不允许您更改返回类型 虚拟调度在运行时完成,但方法和对象的类型必须正确且在编译时相同。
如果您只需要打印该值,只需添加虚拟ToString()方法即可。如果你不想为每个衍生类型再次写它,或者甚至让我模板化。