我在头文件中定义了三个类:
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
我做错了什么,我该如何解决?
答案 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套akcja
和kolizja
。一个在Organizm
中声明AND定义及其实现。第二个和派生自Organizm
并且由于不同的签名而未被覆盖。你做的是重载。
答案 2 :(得分:0)
你没有在你的任何类中声明void rysowanie(),因此你的Wilk类仍然是一个抽象类。并且不能实例化抽象类。 此外,你已经重载了虚函数void akcja()和void kolizja(),这又是不同的,并且不会使你的类成为非抽象类。
在Organizm中定义以下功能 virtual void akcja(int *,int *); virtual void kolizja(Organizm *);
并且还给出了rysowanie()的身体