首页 文章

为什么我的C编译器说虚拟成员没有定义?

提问于
浏览
2

This question可能是重复的,但我不确定,因为我的程序在一个文件中 .

// my-program.cpp

class A
{
public:
  virtual void foo();
};

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

int main()
{
  B myB;
}

然后我在终端输入 g++ my-program.cpp ,编译器给我这个警告:

体系结构x86_64:"typeinfo for A"的未定义符号,引用自:bin cce8BmNY.o "vtable for A"的typeinfo,引用自:cce8BmNY.o中的A :: A()注意:缺少vtable通常意味着第一个非内联虚拟成员函数没有定义 . ld:找不到架构的符号x86_64 collect2:ld返回1退出状态

2 回答

  • 7

    它说没有定义,因为没有定义 . 你已经声明 A::foo() ,但没有定义它 .

    也许你希望它是纯虚拟的(使基类 A 抽象):

    virtual void foo() = 0;
    

    在这种情况下,它不需要定义,因为它总是会在任何可以实例化的类中被重写 .

    或者您希望能够直接实例化 A ,在这种情况下,它需要一个定义 .

  • 3

    如果你想拥有一个没有定义的函数,你应该写 virtual void foo() = 0; .

相关问题