打印继承功能

时间:2018-10-24 14:52:48

标签: c++ inheritance

我正在尝试完成以前的面向对象编程考试卷,涉及C ++中的继承。这是UML This is the UML

我正在尝试打印示例输出的第二行,如试卷上所示。该程序应使用继承来输出学生姓名,DOB和部门,但我不确定如何输出前两个。我已经实现了继承,但是Person和Date类的打印功能无法打印。完整的代码实现here

这是学生班:

#include "Person.h"

class Student :
    public Person
{
public:
    Student(string, string, int, int, int);
    void print();
    ~Student();
private:
    string Dept;
};

Student::Student(string d, string name, int mm, int dd, int yy)
    : Person(name, mm, dd, yy)
{
    Dept = d;
}

void Student::print()
{
    cout << Dept;
}

这是Person类:

#include "Date.h"

class Person
{
public:
    Person(string, int, int, int);
    void getName();
    void setName(string);
    void print();
    ~Person();
private:
    string Name;
    Date DOB;
};

Person::Person(string n, int bmonth, int bday, int byear)
    : DOB(bmonth, bday, byear)
{
    setName(n);
}

void Person::getName()
{
    cout << Name;
}

void Person::setName(string nm)
{
    Name = nm;

}

void Person::print()
{
    getName();
    cout << ", DOB: ";
    DOB.print();
}

测试输出:

Student s("Applied Computing", "James Hall", 12, 12, 1988);
    cout << endl;
    cout << "Student created: ";
    s.print();

1 个答案:

答案 0 :(得分:2)

您是否要运行提供的确切代码?因为它缺少主要功能。

s.print()将永远不会调用Person类打印方法,因为您在Student中定义了一个具有相同名称的方法。因此,它将仅打印学生的姓名。如果要使用基类方法,则必须在派生类的方法中显式调用它(例如,通过在Student类的print方法中编写Person::print()),或者简单地不使用在派生类上使用相同的名称(您应该阅读继承和虚拟类在C ++中的工作方式)。特别是对于您的问题,您需要第一种选择,即:

void Student::print()
{
  Person::print();
  cout << ", " << Dept << endl;
}

此外,冲洗流也是个好习惯。输出流已缓冲,因此您可以手动刷新它们或希望它们被刷新。在打印结束时添加cout << endlcout << flush