为什么这个对象没有检测到父亲class?

Why this object doesn't detect the father class?

我有以下 classes:

Automata Class

#ifndef Automata_H
#define Automata_H

class Automata {

protected:
   // ...
public:
   virtual DFA* dfaEquivalent() {}
   // ....
};

继承自AutomataDFAclass

#include "Automata.hpp"
#ifndef DFA_H
#define DFA_H

class DFA : public Automata 
{
private:
public:
   DFA() {}
};

最后继承自 DFA:

#include "DFA.hpp"

#ifndef _NFA_H
#define _NFA_H

class NFA : public DFA
{
private:
public:
   NFA() { }
   DFA* dfaEquivalent()
   {}
};
#endif

当我有一个 NFA 的实例并且我想调用 dfaEquivalent 时,问题就来了,编译器说如下:

g++    -c -o main.o main.cpp
In file included from DFA.hpp:1:0,
                 from NFA.hpp:1,
                 from Comparador.hpp:5,
                 from main.cpp:2:
Automata.hpp:96:13: error: ‘DFA’ does not name a type; did you mean ‘DFA_H’?
     virtual DFA* dfaEquivalent(){}
             ^~~
             DFA_H
<builtin>: recipe for target 'main.o' failed
make: *** [main.o] Error 1

我在继承方面犯了什么错误?

您在基础 class 中缺少前向声明(即在 Automata.h 中)header.

编译器当时并不知道DFA是什么类型,它编译了Automata.hheader(即在Automata的虚函数class)

virtual DFA* dfaEquivalent(){}
//      ^^^^--> unknown type

因为它是指向类型 DFA 的指针,在 Automata.h 中为 DFA 提供前向声明 header 将解决问题。

#ifndef Automata_H
#define Automata_H

class DFA; // forward declaration

class Automata 
{
public:
   virtual DFA* dfaEquivalent() {}
   // ...code
};
#endif

作为旁注,请看一下:When to use virtual destructors?。如果您将 child class object 存储为指向 Automata.

的指针,您的 Automata 可能需要一个