首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++多态印刷

C++多态印刷
EN

Stack Overflow用户
提问于 2016-11-09 11:40:55
回答 1查看 1.1K关注 0票数 1

假设我们有两个字段的类Person --名字和数字。类学生继承Person并添加另一个名为averageGrade的字段。

我已经为Person和Student定义了操作符"<<“,并且希望能够有一个Person数组,它也将包含Student对象。当我想从碰巧是一个学生的数组中打印一个元素时,我想要操作符"<<“的定义,该操作符是要被调用的,而不是针对Person的。

怎样才能做到这一点?

人h:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-09 11:53:20

一种方法看起来很简单。

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

代码语言:javascript
复制
virtual std::ostream & out( std::ostream & );

然后编写输出运算符,如

代码语言:javascript
复制
friend std::ostream & operator <<( std::ostream &os, const Person &person )
{
    return person.out( os );
}

代码语言:javascript
复制
friend std::ostream & operator <<( std::ostream &os, const Student &student )
{
    return student.out( os );
}

或者只有第一个操作员。

请注意,您不能声明一个数组,该数组将存储类型为Person和store类型的对象。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40506142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档