C++ "Pure virtual method called" 使用抽象基类

C++ "Pure virtual method called" with use of abstract baseclass

我正在使用仅具有纯虚方法的抽象基础class,以在 C++ 中具有接口行为(是的,我来自 Java)。 就我所做的研究而言,这似乎是可行的方法。

我必须抽象基础 classes、GraphReader 和 Graph。

class Graph{
   public:
   Graph() {};
   virtual ~Graph() {};
   virtual void layout() = 0;
   virtual std::vector<std::shared_ptr<Node>> getNodes() = 0;
   virtual std::vector<std::shared_ptr<Edge>> getEdges() = 0;

   protected:

};

class GraphReader{
   public:
   GraphReader(std::string fileName_) :
         fileName(fileName_) {};
   virtual ~GraphReader() {};
   virtual Graph* read() = 0;

   protected:
   std::string fileName;
};

这两个派生自 GraphReader/Graph 的 classes。

class OgdfGraph : public Graph{
   public:
   OgdfGraph();
   virtual ~OgdfGraph();
   void setOgdfGraph(ogdf::Graph &oGraph);
   std::vector<std::shared_ptr<Node>> getNodes();
   std::vector<std::shared_ptr<Edge>> getEdges();
   void layout();

   private:
   [...]

};

class OgdfGmlReader : public GraphReader {  
   public:
   OgdfGmlReader(std::string fileName);
   virtual ~OgdfGmlReader();
   Graph* read();    
};

使用 read() 函数 return 计算 Graph* 值如下:

Graph* OgdfGmlReader::read() {

   [...]

   OgdfGraph og;
   og.setOgdfGraph(G);
   Graph* graph = &og;

   return graph;
}

我主要做以下事情:

   OgdfGmlReader tr = OgdfGmlReader("../data/lesmiserables.gml");
   GraphReader* gr = &tr;
   Graph* graph = gr->read();

   graph->layout();

图的加载工作正常,但是当我在图上调用布局函数时,出现以下错误(在运行时,它编译):

pure virtual method called
terminate called without an active exception
Aborted (core dumped)

这个问题是不是因为我 return Graph 而不是直接在它把派生的 class 分配给它的父 class 之前,就像 GraphReader 一样? 我最困惑,因为它适用于 GraphReader 但不适用于 Graph(return 来自 GraphReader),因为我的理解完全相同。

非常感谢任何解决此问题(同时可能保持继承架构)的帮助!

非常感谢您!

问题出在Read函数中:

OgdfGraph og 的实例是分配给 graph 的局部变量,从读取函数返回。请注意变量 og 将超出范围并在 Read 函数执行后被删除。因此 graph 将仍然只是一个指向 Graph* 的指针,而没有为其分配任何有效实例。

您可以通过将 OgdfGraph og 更改为 OgdfGraph* pog = new OgdfGraph()

来修复它