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;