2

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

各派生クラスには、異なる型 (bool、int など) を返す getVal() という名前のメソッドがあります。Variable クラスのポリモーフィック動作を許可したい。
私は試しました:void getVal();これは間違っているように見え、コンパイラはエラーを示しました:shadows Variable::getVal()これは悪いように聞こえます。使おうと思っtemplate <typename T> T getVal();たけどダメだった。

助言がありますか?そのためにキャストを使用する必要がありますか?

どうもありがとう...

4

2 に答える 2

1

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

使い方はとても簡単です:

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() メソッドを追加するだけです。または、派生型ごとに再度記述したくない場合は、テンプレート化することもできます。

于 2013-10-06T13:34:44.417 に答える