简体   繁体   English

纯虚函数和三杠杆继承

[英]Pure virtual functions and three lever inheritance

I have three classes defined in header files: 我在头文件中定义了三个类:

Organizm.h: 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: 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

And Wilk.h: 和Wilk.h:

#include "Zwierze.h"

#ifndef Wilk_H 
#define Wilk_H

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

#endif

All non virtual methodths are defined in corresponding files: Organizm.cpp, Zwierze.cpp Wilk.cpp 所有非虚拟方法均在相应的文件中定义:Organizm.cpp,Zwierze.cpp Wilk.cpp

But when compiling I get following error messg: 但是在编译时出现以下错误信息:

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

What am I doing wrong and how can I solve that? 我在做什么错,我该如何解决?

void akcja(int *, int *) are different from void akcja() (overloading). void akcja(int *, int *)void akcja() (重载)不同。 You don't define void akcja() anywhere. 您不会在任何地方定义void akcja()

In Zwierze You are not overriding the methods from Organizm . Zwierze您不会覆盖Organizm的方法。

This compiles: 这样编译:

#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;
}

In your case already Zwierze has 2 sets of akcja and kolizja declared. 在您的情况下, Zwierze已经Zwierze了2套akcjakolizja One declared AND defined in Organizm and its implementation. Organizm及其实现中声明了一个AND。 The second and were derived from Organizm and NOT overridden due to different signatures. 第二个和源自Organizm ,由于签名不同而Organizm覆盖。 What you did was overloading . 你所做的就是超载

you didnt declare void rysowanie() in any of your class, therefore your Wilk class remains a abstract class. 您没有在任何类中声明void rysowanie(),因此Wilk类仍然是抽象类。 and a abstract class cant be instantiated. 并且无法实例化抽象类。 Moreover, you have overloaded the virtual functions void akcja() and void kolizja(), which is again different and dont make your class an non abstract class. 此外,您已经重载了虚函数void akcja()和void kolizja(),它们又是不同的,并且不要使您的类成为非抽象类。

define the below functions in Organizm virtual void akcja(int *, int *); 在Organizm虚拟void akcja(int *,int *)中定义以下函数; virtual void kolizja(Organizm *); 虚拟虚空kolizja(Organizm *);

and also give body of void rysowanie() 并给出空的rysowanie()

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

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