试图从多态函数中获得不同的输出
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;
该函数将ID、title和status打印到控制台。
现在根据Medium
的type,我想使用函数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
析构函数。
那么在你的班级Buch
的ausgabe()
应该是:
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 中的析构函数已经是虚拟的了。非常感谢您的时间和帮助!:)以上是关于试图从多态函数中获得不同的输出的主要内容,如果未能解决你的问题,请参考以下文章