【发布时间】:2016-11-09 11:40:55
【问题描述】:
假设我们有一个 Person 类,它有两个字段——名字和数字。 Student 类继承了 Person 并添加了另一个名为 averageGrade 的字段。
我已经为 Person 和 Student 定义了运算符“
如何做到这一点?
person.h:
#pragma once
#include <iostream>
#include <string>
using namespace std;
class Person
{
private:
string name;
int number;
public:
Person();
Person(string,int);
friend ostream& operator<<(ostream& os, const Person& person);
};
person.cpp:
#include "person.h"
Person::Person() : Person("defaultName", 0)
{
}
Person::Person(string name, int number)
{
this->name = name;
this->number = number;
}
ostream& operator<<(ostream& os, const Person& person)
{
os << "Name: " << person.name << endl;
os << "Number: " << person.number;
return os;
}
学生.h:
#pragma once
#include "person.h"
class Student : public Person
{
private:
double averageGrade;
public:
Student();
Student(string, int, double);
friend ostream& operator<<(ostream& os, const Student& student);
};
学生.cpp:
#include "student.h"
Student::Student() : Person()
{
this->averageGrade = 5.0;
}
Student::Student(string name, int number, double avgGrade) : Person(name, number)
{
this->averageGrade = avgGrade;
}
ostream& operator<<(ostream& os, const Student& student)
{
os << (Person) student << endl;
os << "Average grade: " << student.averageGrade;
return os;
}
main.cpp:
#include "student.h"
int main()
{
Person people[10];
people[0] = Person("Tom", 1);
people[1] = Student("Greg", 6, 5.74);
cout << people[0] << endl;
cout << people[1] << endl; // prints only the name and number, without the grade
return 0;
}
【问题讨论】:
-
对于运行时多态性,可以看virtual。
-
给基类一个
virtual函数,如std::ostream& print(std::ostream& os),并让基类operator<<调用它。您不能将<<本身设为virtual,因为它不能是成员函数(流必须是第一个参数)。 -
如果你想把不同类型的人放在一个数组中,你必须存储(智能)指针。您现在所做的称为“切片”:使用
people[1] = Student("Greg", 6, 5.74);,您从右侧Student分配公共字段的Person(notStudent!)元素副本。
标签: c++ polymorphism ostream