Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 纯虚函数与三层继承_C++_G++ - Fatal编程技术网

C++ 纯虚函数与三层继承

C++ 纯虚函数与三层继承,c++,g++,C++,G++,我在头文件中定义了三个类: 组织M.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

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

组织M.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
g++-c-o main.o main.cpp
main.cpp:在函数“int main()”中:
main.cpp:13:16:错误:无法分配抽象类型为“Wilk”的对象
w1=新Wilk();
^
在main.cpp中包含的文件中:5:0:
Wilk.h:6:7:注意:因为以下虚拟函数在“Wilk”中是纯函数:
Wilk类:公共Zwierze{
^
在Swiat.h:2:0中包含的文件中,
来自main.cpp:3:
org.h:11:16:note:virtualvoid-Organizm::akcja()
虚空akcja()=0;
^
Organizm.h:12:16:note:virtualvoid-Organizm::kolizza()
虚拟void kolizza()=0;
^
:polecenia dla obiektu'main.o'nie powiodły się
制作:**[main.o]Błd 1
zsh:2号出口制造

我做错了什么?我如何解决这个问题?

您没有在任何类中声明void rysowanie(),因此您的Wilk类仍然是一个抽象类。抽象类无法实例化。 此外,您重载了虚拟函数void akcja()和void kolizza(),这两个函数又是不同的,不会使您的类成为非抽象类

在Organizm中定义以下功能 虚空akcja(int*,int*); 虚拟虚拟空间Kolizza(Organizm*)


同时给出void rysowanie()的主体。

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

在Organizm中定义以下功能 虚空akcja(int*,int*); 虚拟虚拟空间Kolizza(Organizm*)


也给出了void rysowanie()的主体。

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

void akcja(int*,int*)
不同于
void akcja()
(重载)。你没有定义
void akcja()
anywhere.

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;
}
#包括
使用名称空间std;
阶级组织{
公众:
因特西拉;
int inicjatywa;
int trup;
虚空akcja()=0;
虚拟void kolizza()=0;
虚空rysowanie()=0;
};
Zwierze类:公共组织{
公众:
void akcja(){};
void kolizza(){};
};
Wilk类:公共Zwierze{
公众:
威尔克(){};
void rysowanie(){};
};
int main(){
威尔克·威尔克;
返回0;
}

在您的案例中,
Zwierze
已经声明了两组
akcja
kolizja
。其中一组在
Organizm
及其实现中声明和定义。第二组和来自
Organizm
,并且由于不同的签名而没有被覆盖。您所做的是中重载de>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;
}
#包括
使用名称空间std;
阶级组织{
公众:
因特西拉;
int inicjatywa;
int trup;
虚空akcja()=0;
虚拟void kolizza()=0;
虚空rysowanie()=0;
};
Zwierze类:公共组织{
公众:
void akcja(){};
void kolizza(){};
};
Wilk类:公共Zwierze{
公众:
威尔克(){};
void rysowanie(){};
};
int main(){
威尔克·威尔克;
返回0;
}

在您的案例中,
Zwierze
已经声明了两组
akcja
kolizja
。其中一组在
Organizm
及其实现中声明和定义。第二组和来自
Organizm
,并且由于不同的签名而没有被覆盖。如果您nt若要创建派生类的实例,它必须为基类中声明的所有纯虚拟成员函数提供实现(尚未定义)。在我看来,您发布了两次Zwierze.h,而不是Wilk.hFixed。您知道我现在做错了什么吗?如果要创建派生类的实例,它必须在基类中声明的所有纯虚拟成员函数的定义尚未定义。在我看来,您发布了两次Zwierze.h,而不是Wilk.hFixed。您知道我现在做错了什么吗?