[英]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套akcja
和kolizja
。 在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.