未定义的vtable参考

时间:2012-08-18 16:54:31

标签: c++ class inheritance abstract-class

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

但是,由于编译器生成“对于vtable for Actor”的未定义引用,因此我无法使用代码。在这里你有代码产生相同的错误,而不是原始的错误,因为它不太清楚。我真的不知道是什么原因造成的。

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);
}

这个问题可能是愚蠢的,我不知道,我到处挖,但没有找到能解决我问题的事情。

5 个答案:

答案 0 :(得分:8)

您需要使virtual void move();成为纯虚函数:

virtual void move() = 0;

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

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

答案 1 :(得分:1)

在Actor中定义

virtual void move() = 0;

而不是

virtual void move();

答案 2 :(得分:0)

错误对vtable的未定义引用通常意味着声明了虚函数但未定义。

答案 3 :(得分:0)

@Maxim在你的案例中提供了答案,但更一般地说(来自@Maxim提供的链接):

  

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

导致我停顿的是上述引文中的最后一句,乍一看并不明显。

答案 4 :(得分:0)

对于每个具有虚函数的类,都是vtable中的类的一个条目,它还包含指向所有虚函数的指针。

因为出现虚拟void move();在基类声明中,编译器查找类定义(即)vtable中的相应条目,因为你没有定义,所以这里没有。

如此纯粹的虚函数将解决错误。