【问题标题】:Polymorphism vector in C++C++中的多态向量
【发布时间】:2013-07-05 10:54:01
【问题描述】:

我正在尝试用 C++ 语言进行多态性。我的父类是 Person,然后有一个派生类叫做 Student。这是我的 Person.h 和 .cpp:

class Person
{
public:
Person(string name);
virtual void display() const;
string get_name() const;
void set_name(string name);
string get_birthDay() const;
void set_birthDay(string birthDay);
private:
string name;
string birthDay;
};

.cpp:

Person::Person(string name)
{
this->name = name;
}

string Person::get_name() const
{
return name;
}

void Person::set_name(string name)
{
this->name = name;
}

string Person::get_birthDay() const
{
return birthDay;
}

void Person::set_birthDay(string birthDay)
{
this->birthDay = birthDay;
}

void Person::display() const
{
cout << get_name() << " " << get_birthDay() << endl;
}

这是我的 Student.h 和 .cpp:

class Student : public Person
{
public:
Student(string name, string major);
virtual void display() const;
string get_major() const;
void set_major(string major);
private:
string major;
};

.cpp:

Student::Student(string name, string major)
:Person(name)
{
this->major = major;
}

string Student::get_major() const
{
return major;
}

void Student::set_major(string major)
{
this->major = major;
}

void Student::display() const
{
cout << get_name() << " " << get_major() << endl;
}

在我的主要方法之前,一切都很好。这是我的主要方法:

int main()
{
vector <Person*> person_list;
person_list.push_back(Student("Student","IT"));
person_list.push_back(Instructor("Instrructor", 2500));

for(int count=0; count< person_list.size(); count++)
{
    cout << person_list[count]->display() << endl;
}

system("Pause");
return 0;
}

我在 push_back 和 cout 那里遇到了错误。 push_back to vector 的错误消息是:没有重载函数的实例与参数列表匹配。至于 cout,没有运算符匹配操作数。我不知道为什么。有人可以帮我解决吗?

提前致谢。

【问题讨论】:

    标签: c++ pointers vector polymorphism


    【解决方案1】:

    您的 person_list 存储指针,但您推送的是对象:

    解决您的问题:

    person_list.push_back(new Student("Student","IT"));
                        //^^^^               
    person_list.push_back(new Instructor("Instrructor", 2500));
    

    要在 STL 容器中存储指针,最好使用智能指针:

    #include <memory>
    std::vector <std::unique_ptr<Person>> person_list;
    

    【讨论】:

    • 我以前试过这个,但错误信息还是一样
    • 我可以看到 Instructor 构造函数吗?
    • Instructor::Instructor(字符串名称,浮动薪水) :Person(name) { this->salary = 薪水; }
    • 但是目前我们的教学大纲只到这里。在进入另一个阶段之前,我需要确保我理解了这一点
    • 你在 Instructor 前面也添加了 new,如我的示例代码所示?
    【解决方案2】:

    您需要将指针推回 Student;即使用

    person_list.push_back(new Student("Student","IT"));

    但是,您需要非常小心地使用内存,因为您需要删除已分配的内存;向量在销毁时不会为您执行此操作。

    考虑改用智能指针

    【讨论】:

    • @Gwen:“这并不能解决问题”:您在该特定行收到的错误消息是什么?
    • @Gwen 你确定你没有编译旧版本的文件吗?它对我有用:ideone.com/Q6nbTQ
    • 不编译旧版本文件是什么意思?
    • 意外编译了未修复的源版本。 Bathsheba 提出的更改与我的回答相结合确实有效。查看链接。
    • 没关系,我会再次尝试从头开始重新创建和重新编码。稍后我会回复你
    【解决方案3】:
    cout << person_list[count]->display() << endl;
    

    display() 函数的返回类型为 void。你不能输出那个。

    至于push_back:就像其他人说的那样,如果你有一个指针向量,你需要 push_back 一个指针,而不是对象。

    【讨论】:

      猜你喜欢
      • 2021-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      • 2017-05-10
      相关资源
      最近更新 更多