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

时间:2014-05-07 12:56:01

标签: c++ g++

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的未定义符号: " A"的typeinfo,引自: Bin cce8BmNY.o的typeinfo " vtable for A",引自: c :: 8cmNY.o中的A :: A() 注意:缺少vtable通常意味着第一个非内联虚拟成员函数没有定义。 ld:找不到架构x86_64的符号 collect2:ld返回1退出状态

2 个答案:

答案 0 :(得分:7)

它说没有定义,因为没有定义。您已声明A::foo(),但未对其进行定义。

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

virtual void foo() = 0;

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

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

答案 1 :(得分:3)

如果你想要一个没有定义的功能,你应该写virtual void foo() = 0;