0

小さなプログラムに問題があります。目を開けていただければ幸いです。

クラスメンバーとして「name」と「toString()」メソッドを持つ「User」クラスが1つあります。

class User
{
protected:
        string name;
public:
        User(){}
        User(string name) { this->name = name; }
        virtual string toString() const { return name; }
};

User を拡張する別のクラス「Employee」があり、「id」とオーバーロードの「toString()」メソッドも含まれています。

class Employee : public User
{
private:
        string id;
public:
        Employee(string name, string id) : User(name) { this->id = id;}
        string toString() const { return "("+id+")"+name; }
};

さて、これで別のクラス "Stack" がユーザーの配列 (ユーザー ポインターではなく、ユーザー オブジェクトの配列) になりました。

class Stack
{
private:
        User *stack;
        int sp;
        int size;
public:
        Stack(int size){this->size = size; stack = new User[size]; sp = 0;}

.
.
.

問題はこれです:

Stack s(10);
Employee e1("pepito", "1234");

cout << e1.toString(); // PRINTS (1234)pepito -> ITS OK

s.push(e1);
cout << s.pop().toString(); // PRINTS pepito -> WRONG (it uses the toString method of the super class).

次の理由により、この結果が得られたと思います。

  • オブジェクトへのポインターまたは参照の代わりにオブジェクトを格納します。
  • 行: stack = new User[size] で、User の既定のコンストラクターを呼び出します (明示的に記述する必要があり、それが正しかったかどうかはわかりません)。
4

1 に答える 1

1

次の理由により、この結果が得られたと思います。

  • オブジェクトへのポインターまたは参照の代わりにオブジェクトを格納します。

正しい。の配列を動的に割り当てていますUser。この配列内のオブジェクトはUsers のみであり、それ以外のものはありません。それらは決してEmployees ではありません。C++ でポリモーフィックな動作を得るには、へのポインターまたは参照を使用する必要がありますUser

于 2013-05-01T22:08:19.097 に答える