C ++中的多态性向量

时间:2013-07-05 10:54:01

标签: c++ pointers vector polymorphism

我正在尝试用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,没有运算符匹配操作数。我不知道为什么。有人可以帮我解决吗?

提前致谢。

3 个答案:

答案 0 :(得分:2)

您的 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;

答案 1 :(得分:1)

你需要推回一个指向学生的指针;即使用

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

但是,你需要非常小心内存,因为你需要删除你分配的内存;当它破坏时,向量将为你做这个。

请考虑使用智能指针

答案 2 :(得分:0)

cout << person_list[count]->display() << endl;

display()函数属于void返回类型。你无法输出。

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