多态打印

C++ Polymorphic printing

本文关键字:打印 多态      更新时间:2023-10-16

假设我们有一个Person类,它有两个字段:name和number。Class Student继承Person并添加另一个名为averageGrade的字段。

我已经为Person和Student定义了运算符"<<",并且希望能够拥有Person数组,该数组也将包含Student对象。当我想从数组中打印一个恰好是Student的元素时,我想要调用特定于Student的操作符"<<"的定义,而不是针对Person的定义。

一个人该怎么做呢?

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;
}

student.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;
}

方法看起来很简单。

在每个类中定义一个public或protected虚函数,例如

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和Students类型对象的数组。