C++, inheritance, virtual

C++, inheritance, virtual

本文关键字:virtual inheritance C++      更新时间:2023-10-16

我这里有一些问题。我正在努力使我的代码像java界面一样工作。这个类被另外两个类继承,它们造成了一些问题。我也想知道如果我这样做是正确的,改进我的代码的方法。我的小沟新手。看:

接口类:

#include <iostream>
#include <string>
class IZarzadzaniePozycjami{
public:
    IZarzadzaniePozycjami(void);
    ~IZarzadzaniePozycjami(void);
public:
    virtual void ZnajdzPozycjePoTytule();
    virtual void ZnajdzPozycjePoId();
    virtual void WypiszWszystkiePozycje();

};
#include "Pozycja.h"
#include "IZarzadzaniePozycjami.h"
#include <iostream>
#include <list>

从IZarzadzanie继承的目录类…类。

#include "Pozycja.h"
#include "IZarzadzaniePozycjami.h"
#include <iostream>
#include <list>
class Katalog : public IZarzadzaniePozycjami
{
private:
    std::string dzialTematyczny;
public:
    void ZnajdzPozycjePoTytule(std::string tytul);
    void ZnajdzPozycjePoId(int id);
    void WypiszWszystkiePozycje();
    Katalog(void);
    Katalog(std::string dzialTematyczny_);
    void DodajPozycje(Pozycja);
    std::list<Pozycja> lista;
    friend bool operator==(const Katalog & kat, const std::string & s);
    ~Katalog(void);
};
inline bool operator==(std::string& s, Katalog& katalog)
{
    return katalog == s;
}

,然后库类(biblioteka.h)也继承自接口

#include<iostream>
#include "IZarzadzaniePozycjami.h"
#include "Bibliotekarz.h"
#include  "Pozycja.h"
#include "Katalog.h"
class Biblioteka :
    public IZarzadzaniePozycjami
{
public:
    Biblioteka(void);
    ~Biblioteka(void);
    Biblioteka(std::string adres_);
    void DodajBibliotekarza(Bibliotekarz);
    void WypiszBibliotekarzy();
    void DodajKatalog(Katalog);
    void DodajPozycje(Pozycja p, std::string dzialTematyczny);
    void ZnajdzPozycjePoTytule(std::string tytul);
    void ZnajdzPozycjePoId(int id);
    void WypiszWszystkiePozycje();
private: std::string adres;

};

这里有一些错误。抱歉发了这么长时间的邮件。不知道该剪掉什么

c:userskomputerdocumentsvisual studio 2012projectsproject1izarzadzaniepozycjami.h(3): error C2011: 'IZarzadzaniePozycjami' : 'class' type redefinition
1>          c:userskomputerdocumentsvisual studio 2012projectsproject1izarzadzaniepozycjami.h(3) : see declaration of 'IZarzadzaniePozycjami'
1>c:userskomputerdocumentsvisual studio 2012projectsproject1katalog.h(7): error C2504: 'IZarzadzaniePozycjami' : base class undefined
1>c:userskomputerdocumentsvisual studio 2012projectsproject1biblioteka.h(9): error C2504: 'IZarzadzaniePozycjami' : base class undefined
1>  Generating Code...
1>c:userskomputerdocumentsvisual studio 2012projectsproject1katalog.cpp(16): warning C4717: 'operator==' : recursive on all control paths, function will cause runtime stack overflow

在所有头文件中使用#pragma once:

#pragma once
#include <iostream>
#include <string>
class IZarzadzaniePozycjami{
public:
    IZarzadzaniePozycjami(void);
    ~IZarzadzaniePozycjami(void);
....

,并确保与IZarzadzaniePozycjami头包含在IZarzadzaniePozycjami使用之前的任何地方。

声明

virtual void ZnajdzPozycjePoTytule();

但是在你的类中你声明(我希望你定义)

void ZnajdzPozycjePoTytule(std::string tytul);

这是不同的方法。方法签名包括它的参数,所以你的虚拟方法仍然是未实现的。

您所称的"接口"类与Java概念不同。在java中,接口没有实现,但是您定义的类必须有定义的实现。如果将虚方法设置为纯虚方法(例如= 0),则可以避免定义虚方法,但是必须为IZarzadzaniePozycjami的所有非纯虚方法提供实现。在当前的形式中,这意味着必须定义每个方法。这就是为什么它不能编译