C++ 尝试从多态函数获得不同的输出
嗨,我的社区C++ 尝试从多态函数获得不同的输出,c++,function,class,c++11,polymorphism,C++,Function,Class,C++11,Polymorphism,嗨,我的社区 我希望根据要打印的对象的类别有不同的输出,但事实并非如此 中等 中等。cpp Buch.cpp #包括“Buch.h” Buch::Buch(std::string inititel,std::string initAutor):Medium(inititel),autor(initAutor) {//TODO自动生成的构造函数存根} Buch::~Buch(){//TODO自动生成的析构函数存根} void Buch::ausgabe()常量 { 中等:ausgabe(); 标准
我希望根据要打印的对象的类别有不同的输出,但事实并非如此 中等 中等。cpp Buch.cpp
#包括“Buch.h”
Buch::Buch(std::string inititel,std::string initAutor):Medium(inititel),autor(initAutor)
{//TODO自动生成的构造函数存根}
Buch::~Buch(){//TODO自动生成的析构函数存根}
void Buch::ausgabe()常量
{
中等:ausgabe();
标准::cout
现在,根据要打印的介质类型,我想添加
要打印的额外信息。例如,如果媒体是一本书,
关于作者的信息也应该打印出来
因此,您正在寻找动态多态性。然后,您需要在基类(Medium
)中将void ausgabe()const
函数设置为virtual
,以便以多态方式调用它。并且您需要在其他子类(例如classBuch
)中重写它。在给定的代码中,无论如何这些都不存在。除此之外,您还需要在基类中使用virtual
destructor
那么在你的课堂上,Buch的ausgabe()
应该是:
void ausgabe()const override
{
Medium::ausgabe(); // call first base class's ausgabe()
std::cout << "autor :" << autor << std::endl;
}
void ausgabe()常量覆盖
{
Medium::ausgabe();//调用第一个基类的ausgabe()
std::cout请简化类并发布Medium.h文件请发布a。到目前为止,您的代码看起来是正确的,但是您发布的部分并不完整。这是:personAusgeliehen.getName()
?您甚至没有提到。还可以使用if(status)简单地更改开关(status)
。你的中级声明在哪里?对不起,我是新来的stack overflow:)基本上整个事情是关于一个包含书籍、魔法和DVD的“图书馆”。我省略了DVD和magazin的部分,因为它们基本相同。gol将打印整个“图书馆”,具体取决于“中级”的类型不同的信息。非常感谢!基类媒体中ausgabe函数前面的虚函数成功了!我想媒体中的析构函数已经是虚函数了。非常感谢您的时间和帮助!:)
#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;
}
}
#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;
};
#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;
}
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;
}