Функция наследования печати - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь завершить прошлую экзаменационную работу по объектно-ориентированному программированию, которая включает наследование в C ++.Это UML This is the UML.

Я пытаюсь напечатать вторую строку образца вывода, как показано на вопросном листе.Программа должна использовать наследование для вывода имени студента, DOB и отдела, но я не уверен, как вывести первые два.Я реализовал наследование, но функции печати классов Person и Date не печатаются.Полная реализация кода здесь .

Это класс Student:

#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 голосов
/ 24 октября 2018

Вы пытаетесь запустить точный код, который вы указали?Потому что отсутствует основная функция.

s.print() никогда не вызовет метод печати класса Person, поскольку вы определяете метод с тем же именем в Student.Следовательно, он будет печатать только имя студента.Если вы хотите использовать метод базового класса, вы должны либо явно вызвать его в методе производного класса (например, записав Person::print() в методе печати класса Student), либо просто не определять другой метод с тем же именемна производном классе (вы должны прочитать о том, как наследование и виртуальные классы работают в C ++).В частности, для вашей проблемы вам понадобится первый вариант, например, что-то вроде:

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

Также рекомендуется очистить поток.Выходные потоки буферизуются, так что вы либо очищаете их вручную, либо надеетесь, что они будут очищены.Добавьте cout << endl или cout << flush в конце печати. ​​

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...