пытаясь получить разные выводы из полиморфной функции - PullRequest
0 голосов
/ 24 июня 2018

Привет, сообщество StackOverflow!
Я ожидаю разные результаты в зависимости от класса печатаемого объекта, но это не так.

Medium.h

#include "Datum.h"
#include "Person.h"

class Medium
{
public:
    Medium(std::string initTitel);
    virtual ~Medium(void);
    void ausgabe() const;
    bool ausleihen(Person person, Datum ausleihdatum);
    void zurueckgeben();
    unsigned int getID();
protected:
    static unsigned int currentID;
    unsigned int ID;
    std::string titel;
    bool status;
    Datum datumAusgeliehen;
    Person personAusgeliehen;
};  

Medium.cpp

#include "Medium.h"
#include <string>
#include <iostream>

unsigned int Medium::currentID = 1;

Medium::Medium(std::string initTitel): titel(initTitel), status(false)
{
    ID = currentID++;
}
Medium::~Medium(void)  {}
void Medium::ausgabe() const
{
    std::cout << "ID: " << ID << std::endl;
    std::cout << "Titel: " << titel << std::endl;
    switch (status)
    {
    case true:
        std::cout << "Status : Das Medium ist seit dem " 
                  << datumAusgeliehen  << " an " 
                  << personAusgeliehen.getName() << " ausgeliehen." 
                  << std::endl;
        break;

    case false:
        std::cout << "Status: Medium ist zurzeit nicht verliehen." << std::endl;
        break;
    }
}  

Функция печатает ID , title и status to console.
Теперь, в зависимости от типа из Medium, я хотел бы напечатать дополнительную информацию, используя функцию void ausgabe() const.

Пример. Если носителем является book ( на немецком языке buch = book ), должна быть напечатана информация об авторе в дополнение к другой информации, доступной вMedium класс.то есть у меня есть подкласс с именем Buch, который также имеет функцию void ausgabe() const, которая должна печатать эту дополнительную информацию в классе Buch.

Buch.h

#include "Medium.h"
class Buch: public Medium
{
public:
    Buch();
    Buch(std::string initTitel, std::string initAutor);
    virtual ~Buch();
    void ausgabe() const;
private:
    std::string autor;
};  

Buch.cpp

#include "Buch.h"
Buch::Buch(std::string initTitel, std::string initAutor): Medium(initTitel), autor(initAutor) 
{ // TODO Auto-generated constructor stub  }

Buch::~Buch()    { // TODO Auto-generated destructor stub   }

void Buch::ausgabe() const
{
    Medium::ausgabe();
    std::cout << "Autor: " << autor << std::endl;
}  

Насколько я знаю: в классе Buch при вызове функции вывода ausgabe() дополнительная информация autor будет напечатана автоматически.Но для остальной информации из Medium класса, не могли бы вы помочь.Спасибо за вашу помощь:)

1 Ответ

0 голосов
/ 24 июня 2018

Теперь, в зависимости от типа печатного носителя, я хотел бы добавить дополнительная информация для печати. Например. если Медиум это книга, информация об авторе тоже должна быть напечатана.

Итак, вы ищете динамический полиморфизм. Затем вам нужно сделать функцию void ausgabe()const равной virtual в вашем базовом классе (Medium), чтобы вызвать ее полиморфно. И вам нужно override это в других подклассах (например, класс Buch). В данном коде в любом случае их нет. В дополнение к этому вам также понадобится деструктор virtual в вашем базовом классе.

Тогда в вашем классе Buch s ausgabe() должно быть:

void ausgabe()const override
{
    Medium::ausgabe(); // call first base class's ausgabe()
    std::cout << "autor :" << autor << std::endl;
}

Затем вы можете сделать это на своей главной странице: См. Пример кода здесь

int main ()
{
   std::unique_ptr<Medium> some_objects[2];
   some_objects[0] = std::make_unique<Medium>("Some Title");
   some_objects[1] = std::make_unique<Buch>("Title 2", "user9775960");

   for(auto& obj_type: some_objects)
      obj_type->ausgabe();
   return 0;
}

PS: всегда старайтесь публиковать написанный на английском языке код в сообществе, чтобы каждый мог следить за ним.

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