C ++中的动态链接无法正常工作

时间:2013-05-01 22:05:16

标签: c++ inheritance dynamic linker override

我的小程序有问题。我希望你能睁开我的眼睛。

我有一个类,“User”,“name”作为类成员和“toString()”方法:

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

我有另一个类,“Employee”扩展User,它还包含一个“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”,包含一组用户(User对象,而不是User指针):

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的默认构造函数(我必须明确写入,我不知道这是否正确)。

1 个答案:

答案 0 :(得分:1)

  

我想,我可能因为以下原因而得到这个结果:

     
      
  • 存储对象而不是指针或对象的引用。
  •   

正确。您正在动态分配User的数组。此数组中的对象只能是User s而不是其他内容。他们永远不会Employee。要在C ++中获得多态行为,您需要使用指针或对User的引用。