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
,以便以多态方式调用它。并且您需要在其他子类(例如class
Buch
)中重写它。在给定的代码中,无论如何这些都不存在。除此之外,您还需要在基类中使用
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;
}