C++对 vtable 和继承的未定义引用
文件 Ah
#ifndef A_H_
#define A_H_
class A {
public:
virtual ~A();
virtual void doWork();
};
#endif
文件 Child.h
#ifndef CHILD_H_
#define CHILD_H_
#include "A.h"
class Child: public A {
private:
int x,y;
public:
Child();
~Child();
void doWork();
};
#endif
和 Child.cpp
#include "Child.h"
Child::Child(){
x = 5;
}
Child::~Child(){...}
void Child::doWork(){...};
编译器表示 A
存在对 vtable 的未定义引用。 我尝试了很多不同的方法,但没有一个有效。
我的目标是让 A
类成为一个接口,并将实现代码与标头分开。
File A.h
#ifndef A_H_
#define A_H_
class A {
public:
virtual ~A();
virtual void doWork();
};
#endif
File Child.h
#ifndef CHILD_H_
#define CHILD_H_
#include "A.h"
class Child: public A {
private:
int x,y;
public:
Child();
~Child();
void doWork();
};
#endif
And Child.cpp
#include "Child.h"
Child::Child(){
x = 5;
}
Child::~Child(){...}
void Child::doWork(){...};
The compiler says that there is a undefined reference to vtable for A
.
I have tried lots of different things and yet none have worked.
My objective is for class A
to be an Interface, and to seperate implementation code from headers.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
为什么会出现错误&如何解决?
您需要提供
A 类
中所有虚函数的定义。只允许纯虚函数没有定义。即:在
类A
中,两种方法:都应该被定义(应该有一个主体),
例如:
A.cpp
警告:
如果您希望您的
A类
充当接口(又名C++ 中的抽象类),那么您应该将该方法设置为纯虚方法。好读:
这是什么意思“虚拟表”是一个未解析的外部?
构建 C++ 时,链接器说我的构造函数、析构函数或虚拟表未定义。
Why the error & how to resolve it?
You need to provide definitions for all virtual functions in
class A
. Only pure virtual functions are allowed to have no definitions.i.e: In
class A
both the methods:should be defined(should have a body)
e.g.:
A.cpp
Caveat:
If you want your
class A
to act as an interface(a.k.a Abstract class in C++) then you should make the method pure virtual.Good Read:
What does it mean that the "virtual table" is an unresolved external?
When building C++, the linker says my constructors, destructors or virtual tables are undefined.
在这种情况下,将 A 类中的成员函数设置为纯虚函数。
In that case, make the member function as pure virtual in class A.
如果其他答案都无法帮助您,请确保删除所有“*.gch”文件。
Make sure to delete any "*.gch" files if none of the other responses help you.