【问题标题】:Multiple inheritance with QObject使用 QObject 进行多重继承
【发布时间】:2013-03-30 15:02:07
【问题描述】:

我想继承 QObject 和另一个类,结果报错: `vtable for EduGraph' 的未定义参考 我已经阅读了一些关于它的线程并修复了类定义中继承类的顺序,但它并没有解决问题。

class EduGraph : public QObject, public Graph<Vertex<ENode, EEdge>*> {
private:
    std::list<Vertex<ENode, EEdge>*>::iterator firstSel;
    std::list<Vertex<ENode, EEdge>*>::iterator secSel;
public:

Q_OBJECT

    EduGraph() : firstSel(0), secSel(0) {}
    ~EduGraph();

    void NewNode(const QPoint& p);
    void RemoveNode();
    void Associate();
    void Dissociate();

signals:
    void VertexSelected();
    void VertexDeSelected();
};

【问题讨论】:

  • 您确定需要多重继承吗?从上面的代码来看,使用组合看起来会起作用(即在你的类中有一个 Graph&lt;...&gt; 成员,而不是从它继承)。
  • 重新运行 qmake 有帮助吗?此外,Q_OBJECT 宏在技术上应该位于类定义的私有部分中。通常,它是左花括号之后的第一件事。

标签: c++ qt polymorphism multiple-inheritance qobject


【解决方案1】:
`Undefined reference to `vtable for...'` 

通常是未实现的虚函数的标志。 确保您已实现(定义)相应的从基类继承的虚函数

例如这会给你同样的错误,因为 B 中的打印方法没有实现。

class A {
public:
    virtual void print() = 0;
};

class B : public A{
public:
    void print();
};

int main()
{
    B b;
}

【讨论】:

  • 除非您实际调用了print 方法,否则您的示例将not give any error
  • 至少在 gcc 4.4.0 上确实给出了错误消息。 如果您不声明 B 的实例,您不会收到错误消息。因此,我为什么要在 main 中声明。
  • 首先是 (gcc-4.7.2)。另外,即使那是相同的版本,您要做的就是告诉我,我在终端上看到的内容是我想象的结果。也许是这样,但我对此表示怀疑。
  • 您至少可以尝试解释为什么不应该这样做,或者它是否是由某些配置引起的......
  • 规则说不能创建抽象类的任何对象。一个抽象类至少有一个纯虚函数。没有B中的overidding方法,你的类会自动变成如果你 just create an instance ,一个抽象类和编译器会抱怨。一旦你覆盖了方法 print()。您指示编译器,我的类不是抽象类,并承诺编译器在链接时提供其定义。这类似于声明一个方法而不定义它,no error 直到method invocation
猜你喜欢
  • 1970-01-01
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-29
相关资源
最近更新 更多