假设我们有两个字段的类Person --名字和数字。类学生继承Person并添加另一个名为averageGrade的字段。
我已经为Person和Student定义了操作符"<<“,并且希望能够有一个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);
};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;
}发布于 2016-11-09 11:53:20
一种方法看起来很简单。
例如,在每个类中定义一个公共或受保护的虚拟函数,如
virtual std::ostream & out( std::ostream & );然后编写输出运算符,如
friend std::ostream & operator <<( std::ostream &os, const Person &person )
{
return person.out( os );
}和
friend std::ostream & operator <<( std::ostream &os, const Student &student )
{
return student.out( os );
}或者只有第一个操作员。
请注意,您不能声明一个数组,该数组将存储类型为Person和store类型的对象。
https://stackoverflow.com/questions/40506142
复制相似问题