未定义引用的vtable(Undefined reference to vtable)

2019-07-31 01:48发布

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

但是,我坚持的代码,因为编译器生成“未定义引用的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);
}

这个问题可能是愚蠢的,我不知道,我已经挖到处,但发现没有什么会解决我的问题。

Answer 1:

你需要要么使virtual void move(); 纯虚函数:

virtual void move() = 0;

或限定Actor::move()为一个基类

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


Answer 2:

在演员确定

virtual void move() = 0;

代替

virtual void move();


Answer 3:

错误未定义的引用通常V表意味着虚拟函数被声明,但没有定义。



Answer 4:

@Maxim你的情况给出了答案,但更一般地说(由@Maxim提供的链接):

该解决方案是确保不在纯所有虚拟方法被定义。 请注意,即使它被声明纯虚析构函数必须定义。

我来到嘎然而止在上述报价,这是不是在第一眼明显的最后一句话。



Answer 5:

对于有虚函数,在虚函数表其还具有指向所有虚拟功能所做类条目的每个类。

由于存在发生虚拟无效移动(); 声明在基类中,编译器查找类的定义(即)的虚函数表的相应条目whoch为u没有定义在这里不可用。

所以纯虚函数将解决ERR。



文章来源: Undefined reference to vtable