繁体   English   中英

纯虚函数和三杠杆继承

[英]Pure virtual functions and three lever inheritance

我在头文件中定义了三个类:

Organizm.h:

#ifndef Organizm_H
#define Organizm_H

class Organizm {
    public:
        int sila;
        int inicjatywa;
        int trup;

        virtual void akcja() = 0;
        virtual void kolizja() = 0;
        virtual void rysowanie() = 0;
};

#endif

Zwierze.h:

#include "config.h"
#include "Organizm.h"

#ifndef Zwierze_H
#define Zwierze_H

class Zwierze : public Organizm {
    public: 
        void akcja(int *, int *);
        void kolizja(Organizm *);
};

#endif

和Wilk.h:

#include "Zwierze.h"

#ifndef Wilk_H 
#define Wilk_H

class Wilk: public Zwierze {
    public:
        Wilk();
        void rysowanie();
};

#endif

所有非虚拟方法均在相应的文件中定义:Organizm.cpp,Zwierze.cpp Wilk.cpp

但是在编译时出现以下错误信息:

g++    -c -o main.o main.cpp
main.cpp: In function ‘int main()’:
main.cpp:13:16: error: cannot allocate an object of abstract type ‘Wilk’
  w1 = new Wilk();
                ^
In file included from main.cpp:5:0:
Wilk.h:6:7: note:   because the following virtual functions are pure within ‘Wilk’:
 class Wilk: public Zwierze {
       ^
In file included from Swiat.h:2:0,
                 from main.cpp:3:
Organizm.h:11:16: note:         virtual void Organizm::akcja()
   virtual void akcja() = 0;
                ^
Organizm.h:12:16: note:         virtual void Organizm::kolizja()
   virtual void kolizja() = 0;
                ^
<wbudowane>: polecenia dla obiektu 'main.o' nie powiodły się
make: *** [main.o] Błąd 1
zsh: exit 2     make

我在做什么错,我该如何解决?

void akcja(int *, int *)void akcja() (重载)不同。 您不会在任何地方定义void akcja()

Zwierze您不会覆盖Organizm的方法。

这样编译:

#include <iostream>
using namespace std;

class Organizm {
    public:
        int sila;
        int inicjatywa;
        int trup;

        virtual void akcja() = 0;
        virtual void kolizja() = 0;
        virtual void rysowanie() = 0;
};

class Zwierze : public Organizm {
    public: 
        void akcja(){};
        void kolizja(){};
};

class Wilk: public Zwierze {
    public:
        Wilk(){};
        void rysowanie(){};
};


int main() {
    Wilk wilk;
    return 0;
}

在您的情况下, Zwierze已经Zwierze了2套akcjakolizja Organizm及其实现中声明了一个AND。 第二个和源自Organizm ,由于签名不同而Organizm覆盖。 你所做的就是超载

您没有在任何类中声明void rysowanie(),因此Wilk类仍然是抽象类。 并且无法实例化抽象类。 此外,您已经重载了虚函数void akcja()和void kolizja(),它们又是不同的,并且不要使您的类成为非抽象类。

在Organizm虚拟void akcja(int *,int *)中定义以下函数; 虚拟虚空kolizja(Organizm *);

并给出空的rysowanie()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM