试图从多态函数中获得不同的输出

Posted

技术标签:

【中文标题】试图从多态函数中获得不同的输出【英文标题】:trying to get different outputs from polymorphic function 【发布时间】:2018-06-24 14:57:11 【问题描述】:

您好 *** 社区! 我期待不同的输出取决于要打印的对象的类别,但事实并非如此。

中等.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;
    
  

该函数将IDtitlestatus打印到控制台。 现在根据Mediumtype,我想使用函数void ausgabe() const 打印额外的信息。

示例:如果媒体是book(in German buch = book),除了@中可用的其他信息外,还应打印有关作者的信息987654327@上课。即,我有一个名为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 类的剩余信息,你能帮忙吗?谢谢你的帮助:)

【问题讨论】:

请简化类并发布 Medium.h 文件 请发帖minimal reproducible example。到目前为止,您的代码看起来是正确的,但您发布的部分并不完整 还有这个:personAusgeliehen.getName() ?你连提都没提。也只需使用if (status) 更改switch (status) 你的 Medium 类声明在哪里? 对不起,我刚接触堆栈溢出:) 基本上整个事情都是关于一个包含书籍、杂志和 DVD 的“图书馆”。我省略了 DVD 和杂志的部分,因为它们基本相同。 gol 是打印整个“图书馆”,并根据“媒体”的类型不同的信息。 【参考方案1】:

现在根据要打印的介质类型,我想添加 要打印的额外信息。例如。如果媒介是一本书, 作者的信息也应该打印出来。

所以您正在寻找动态多态性。然后,你需要在你的基类(Medium)中将void ausgabe()const 函数变为virtual,以便多态地调用它。你需要在其他子类中override它(例如类Buch)。无论如何,在给定的代码中这些都不存在。除此之外,您还需要在基类中使用 virtual 析构函数。

那么在你的班级Buchausgabe() 应该是:

void ausgabe()const override

    Medium::ausgabe(); // call first base class's ausgabe()
    std::cout << "autor :" << autor << std::endl;

然后在你的主要,你可以这样做:See an example code here

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:尽量在社区发英文写的代码,让大家关注。

【讨论】:

非常感谢!基类 Medium 中 ausgabe 函数前面的 virtual 做到了!我认为 medium 中的析构函数已经是虚拟的了。非常感谢您的时间和帮助!:)

以上是关于试图从多态函数中获得不同的输出的主要内容,如果未能解决你的问题,请参考以下文章

Java 方法重载和多态

如何获得comm输出的第一列?

当试图输出一个整数时,它会输出一个数字数组到一个文件

为啥在我的 OpenGL 引擎中没有从 MyGUI 获得任何屏幕输出?

Python的封装继承和多态

从 HashMap 中提取值