我正在尝试完成以前的面向对象编程考试卷,涉及C ++中的继承。这是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();
答案 0 :(得分:2)
您是否要运行提供的确切代码?因为它缺少主要功能。
s.print()
将永远不会调用Person
类打印方法,因为您在Student
中定义了一个具有相同名称的方法。因此,它将仅打印学生的姓名。如果要使用基类方法,则必须在派生类的方法中显式调用它(例如,通过在Student类的print方法中编写Person::print()
),或者简单地不使用在派生类上使用相同的名称(您应该阅读继承和虚拟类在C ++中的工作方式)。特别是对于您的问题,您需要第一种选择,即:
void Student::print()
{
Person::print();
cout << ", " << Dept << endl;
}
此外,冲洗流也是个好习惯。输出流已缓冲,因此您可以手动刷新它们或希望它们被刷新。在打印结束时添加cout << endl
或cout << flush
。