C++"使用抽象基类调用纯虚方法"

nur*_*gan 2 c++ inheritance abstract-class abstract-base-class

我使用的是一个只有纯虚方法的抽象基类,在C++中有一个接口行为(是的,我来自Java).就我的研究而言,这似乎是要走的路.

我必须抽象基类,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;
};
Run Code Online (Sandbox Code Playgroud)

这两个都有从GraphReader/Graph继承的派生类.

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();    
};
Run Code Online (Sandbox Code Playgroud)

使用read()函数返回Graph*值,如下所示:

Graph* OgdfGmlReader::read() {

   [...]

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

   return graph;
}
Run Code Online (Sandbox Code Playgroud)

我的主要内容如下:

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

   graph->layout();
Run Code Online (Sandbox Code Playgroud)

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

pure virtual method called
terminate called without an active exception
Aborted (core dumped)
Run Code Online (Sandbox Code Playgroud)

这个问题是否来自于我返回Graph的事实,并且我没有像使用GraphReader那样直接将派生类分配给它的父类?我最困惑的是因为它适用于GraphReader但不适用于Graph(从GraphReader返回),因为它与我的理解完全相同.

任何帮助如何解决这个问题(虽然可能维护继承架构)非常感谢!

非常感谢你提前!

MKR*_*MKR 5

问题在于Read功能:

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

你可以通过改变OgdfGraph ogas 来修复它OgdfGraph* pog = new OgdfGraph()

  • 那么,在这种情况下,它应该返回一个`std :: shared_ptr`来正确管理内存并在任何地方进行适当的更改. (2认同)