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

C++ 为什么我的C++;编译器是否说虚拟成员没有定义?,c++,g++,C++,G++,可能是重复的,但我不确定,因为我的程序位于单个文件中 // 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的类型信息”,引用自: 银行标识代码cce8BmNY.o的

可能是重复的,但我不确定,因为我的程序位于单个文件中

// 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的类型信息”,引用自: 银行标识代码cce8BmNY.o的类型信息 “A的vtable”,引用自: cce8BmNY.o中的A::A() 注意:缺少vtable通常意味着第一个非内联虚拟成员函数没有定义。 ld:找不到架构x86_64的符号
collect2:ld返回了1个退出状态

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

它说没有定义,因为没有定义。您已经声明了
A::foo()
,但没有定义它

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

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

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

virtual void foo() = 0;