1

我已经开始学习 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);
}

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

4

5 回答 5

8

您需要创建virtual void move();一个纯虚函数:

virtual void move() = 0;

Actor::move()为基类定义

void Actor::move() 
{
    // do something
}
于 2012-08-18T16:57:50.333 回答
2

在演员定义

virtual void move() = 0;

代替

virtual void move();
于 2012-08-18T16:58:32.733 回答
0

错误undefined reference to vtable通常意味着声明了虚函数但未定义。

于 2012-08-18T17:30:40.933 回答
0

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

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

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

于 2012-09-01T20:45:14.143 回答
0

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

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

所以纯虚函数将解决错误。

于 2013-02-27T07:47:31.327 回答