继承问题

时间:2011-01-09 02:54:42

标签: c++ inheritance virtual

class OGraph {
public:
    OGraph() { }
    virtual ~OGraph();

    virtual bool is_directed()=0;
};

class OUGraph : public OGraph {
public:
    OUGraph() {  }
    bool is_directed() { return false; }
    ~OUGraph() {}
};

但是当我这样做时

OUGraph myGraph();
cout << myGraph.is_directed();

我收到以下错误:

  

未定义的符号:“typeinfo for   OGraph“,引自:         用于OUGraphin main.o的“vinfo for OGraph”,引用自:         在main.o中的OGraph :: OGraph()mkdir -p dist / Debug / GNU-MacOSX“OGraph :: ~OGraph()”,引用自:   g ++ -o   DIST /调试/ GNU-MacOSX的/ opengraph   构建/调试/ GNU-的MacOSX / OGraph.o   构建/调试/ GNU-的MacOSX / main.o
        OUGraph :: ~OUGraph()在main.o中         OUGraph :: ~OUGraph()in main.o ld:symbol(s)not found collect2:ld   返回1退出状态make [2]: *   [测距/调试/ GNU-MacOSX的/ opengraph]   错误1 make [1]: [.build-conf]   错误2使:* * [.build-impl]错误   2

     

BUILD FAILED(退出值2,总计   时间:568毫秒)

4 个答案:

答案 0 :(得分:4)

此:

OUGraph myGraph();

声明一个名为myGraph的函数,它返回OUGraph。你需要改为:

OUGraph myGraph;

这会声明一个变量,如你所愿。

答案 1 :(得分:2)

所有新的C ++人都属于同样的老事。

OUGraph myGraph();

你没有创建一个名为myGraph的变量,你已经声明了一个名为myGraph的函数,它返回一个OUGraph。删除“()”。

你似乎也从未在任何地方定义过你的基础析构函数。即使它是空的,你也需要定义它,因为你在类定义中声明了它。

答案 2 :(得分:1)

您没有为virtual ~OGraph();提供任何实施。提供一个实现,用= 0;将其指定为纯虚拟,或者只是去除它。

编译器期望将类的类型信息附加到其第一个虚方法的实现。您的第一个虚方法是未定义的,因此永远不会生成实现,并且您会收到相关的链接错误。

此外,正如大家所说,您应该从myGraph的定义中删除括号。

答案 3 :(得分:0)

如果你使用'default'构造函数构建一个新对象,我相信你在没有空括号的情况下调用它。

因此,您可以使用OUGraph myGraph而不是OUGraph myGraph()

相关问题