小さなプログラムに問題があります。目を開けていただければ幸いです。
クラスメンバーとして「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 の既定のコンストラクターを呼び出します (明示的に記述する必要があり、それが正しかったかどうかはわかりません)。