【问题标题】:Undefined reference to vtable对 vtable 的未定义引用
【发布时间】:2012-08-14 18:26:04
【问题描述】:

我已经开始学习 C++,我已经了解 C 和 Java。我开始学习它是因为我想开始使用面向对象编程。

但是,我被代码困住了,因为编译器会生成“对 Actor 的 vtable 的未定义引用”。在这里,您有生成相同错误的代码,而不是原始错误,因为它不太清楚。我真的不知道是什么原因造成的。

struct Actor
{
     int x, y;
     virtual void move();
};

struct Player : Actor
{
     Player(int a, int b)
     {
        x = a;
        y = b;
     }

     void move();
     void draw();
};

void Player::move()
{
    ++x;
};

main()
{
    Actor *act;

    act = new Player(10, 20);
}

这个问题可能很愚蠢,我不知道,我已经到处挖了但没有找到可以解决我的问题的东西。

【问题讨论】:

  • 这是一个非常糟糕的链接器错误消息。这是什么工具集生成的?
  • 这是 GCC。最后一段解释了这个模糊的链接器错误何时出现gcc.gnu.org/faq.html#vtables

标签: c++ class inheritance abstract-class


【解决方案1】:

您需要将virtual void move(); 设为纯虚函数:

virtual void move() = 0;

或为基类定义Actor::move()

void Actor::move() 
{
    // do something
}

【讨论】:

    【解决方案2】:

    在Actor中定义

    virtual void move() = 0;
    

    而不是

    virtual void move();
    

    【讨论】:

      【解决方案3】:

      错误undefined reference to vtable通常表示虚函数已声明但未定义。

      【讨论】:

        【解决方案4】:

        @Maxim 在您的情况下提供了答案,但更笼统地说(来自@Maxim 提供的链接):

        解决办法是确保定义了所有非纯的虚方法。请注意,即使声明为纯虚函数,也必须定义析构函数。

        让我愣住的是上面引用的最后一句话,乍一看并不明显。

        【讨论】:

          【解决方案5】:

          对于每个具有虚函数的类,在 vtable 中创建一个类的条目,该条目还具有指向所有虚函数的指针。

          因为发生了一个虚拟的 void move();基类中的声明,编译器查找类定义(即)vtable 中的相应条目,该条目在此处不可用,因为您尚未定义。

          所以纯虚函数会解决这个错误。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多