【问题标题】:C++ Polymorphic printing [duplicate]C ++多态打印[重复]
【发布时间】: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&amp; print(std::ostream&amp; os),并让基类operator&lt;&lt; 调用它。您不能将&lt;&lt; 本身设为virtual,因为它不能是成员函数(流必须是第一个参数)。
  • 如果你想把不同类型的人放在一个数组中,你必须存储(智能)指针。您现在所做的称为“切片”:使用people[1] = Student("Greg", 6, 5.74);,您从右侧Student 分配公共字段的Personnot Student!)元素副本。

标签: c++ polymorphism ostream


【解决方案1】:

方法看起来很简单。

在每个类中定义一个公共或受保护的虚函数,例如

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 和 Student 类型的对象存储在一起的数组。

【讨论】:

  • 您能否检查一下我的代码目前的情况并推荐我应该更改的内容?我已经编辑了原始帖子。
  • @Mr.Nicky 正如我所写,您可能不会定义 Person 类型的数组并在其中存储 Student 类型的对象。
猜你喜欢
  • 2023-03-27
  • 2020-10-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
相关资源
最近更新 更多