纯虚函数和三杠杆继承

时间:2014-04-23 15:55:50

标签: c++ g++

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

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

但是在编译时我会得到以下错误:#/ p>

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

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

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

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已声明了2套akcjakolizja。一个在Organizm中声明AND定义及其实现。第二个和派生自Organizm并且由于不同的签名而未被覆盖。你做的是重载

答案 2 :(得分:0)

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

在Organizm中定义以下功能 virtual void akcja(int *,int *); virtual void kolizja(Organizm *);

并且还给出了rysowanie()的身体