C++ 缺少vtable通常意味着第一个非内联虚拟成员函数没有定义

C++ 缺少vtable通常意味着第一个非内联虚拟成员函数没有定义,c++,virtual-destructor,C++,Virtual Destructor,我很确定这个问题是重复的,但是我的代码在这里是不同的,下面是我的代码。它失败时出现“未定义符号”错误,不确定缺少什么 class Parent { public : virtual int func () = 0; virtual ~Parent(); }; class Child : public Parent { public : int data; Child (int k) { data = k;

我很确定这个问题是重复的,但是我的代码在这里是不同的,下面是我的代码。它失败时出现“未定义符号”错误,不确定缺少什么

class Parent {
   public :
     virtual int func () = 0;
     virtual ~Parent();

 };


 class Child : public Parent {
     public :

     int data;
     Child (int k) {
        data = k;
      }
    int func() {   // virtual function
       cout<<"Returning square of 10\n";
        return 10*10;
    }

    void Display () {
    cout<<data<<"\n";

 }

 ~ Child() {

    cout<<"Overridden Parents Destructor \n";

 }
};



int main() {
  Child a(10);
 a.Display();

 }
未定义父项::~Parent()

可以将定义直接放入类定义中:

class Parent {
   public :
     virtual int func () = 0;
     virtual ~Parent() {};
 };
或者单独定义它。或者,从C++11开始,编写
virtual~Parent()=default


在任何情况下,析构函数都需要一个定义。

来帮助其他来这里寻求帮助的人 “注意:缺少vtable通常意味着第一个非内联虚拟成员函数没有定义。”

在我的例子中,错误是由于缺少=0;在虚拟定义的末尾。确保所有适当的虚拟定义都具有=0;最后

virtual HRESULT function(int testInput) = 0;

希望这能节省一些时间。

试试
Parent::~Parent()=default这里可以完全避免析构函数吗?@Olshansk:如果你想在某个时候构造它,就不能。如果它是可构造的,那么它一定是可破坏的
virtual
不会改变这一点。“确保所有虚拟定义都具有=0;最后”很抱歉,但是=0基本上是说这个虚拟函数是纯虚拟的,这将反过来将who类转换为抽象类,这有时不是我们想要的。可以存在具有非纯虚函数的类。这个答案绝对正确wrong@Xavier. 感谢您的反馈,我的回答清楚地表明“在我的情况下,错误是由……造成的”,它旨在帮助任何与我面临相同问题的其他人。它的目的不是重新定义规范,只是澄清并帮助解决错误消息的模糊性。这并不意味着答案是绝对错误的,尤其是当你说“有时情况并非如此”时,这意味着在其他情况下情况绝对会如此,因此在这些情况下是正确的。
virtual HRESULT function(int testInput) = 0;