链接器错误:对“vtable for square”的未定义引用.代码包括虚拟函数
Linker Error: Undefined Reference to `vtable for square`. Code includes virtual functions
我在这里检查了对vtable
问题最常见的未定义引用,虽然这让我更好地了解了发生了什么,但我仍然无法收集足够的信息来弄清楚为什么会出现这个错误。
我有一个简单的Square类,最初我试图从Polygon类继承它。由于我对C++相对熟悉,而且还在学习,所以我还没有对多态性做过那么多实验。
无论如何,在我尝试摆脱基类(Polygon
)之后,我认为这可能会有所帮助。不幸的是,我仍然会遇到同样的错误,我不太清楚发生了什么。我所知道的是,最初,Polygon
类需要一个源文件,其中至少有一个构造函数定义,我确实给出了。这消除了Polygon
类的vtable
错误。
我的主要问题是,我仍然为Square
类得到了这个,它应该继承自Polygon类。我想知道的是如何正确地实现这一点,以避免出现vtable
错误,同时还能获得多态性的好处
代码
多边形.h/.cpp
#ifndef POLYGON_H
#define POLYGON_H
#include "Shape.h"
#include "vector3f.h"
class Polygon
{
public:
Polygon();
virtual void Collide(Shape &s) = 0;
virtual void Collide(Polygon &p) = 0;
virtual bool Intersects(const Shape &s) = 0;
virtual bool Intersects(const Polygon &s) = 0;
protected:
virtual void Draw() const = 0;
};
#endif // POLYGON_H
//------------------
#include "Polygon.h"
Polygon::Polygon() {
}
*方形.h/.cpp
#ifndef SQUARE_H
#define SQUARE_H
#include "Polygon.h"
#include "Shape.h"
#include "Vec3f.h"
#include <QGLWidget>
class Square //: public Polygon
{
public:
Square(Vec2f lenwidth = Vec2f(), Vec3f color = Vec3f());
~Square();
virtual void Collide(Shape &s);
virtual void Collide(Square &s);
virtual void Collide(Polygon &p);
virtual bool Intersects(const Shape &s);
virtual bool Intersects(const Polygon &p);
virtual bool Intersects(const Square &s);
virtual float Area(void) const;
protected:
virtual void Draw();
private:
Vec2f mDimensions;
Vec3f mColor;
};
#endif // SQUARE_H
//----------------
#include "Square.h"
/**********/
/* PUBLIC */
/**********/
Square::Square(Vec2f lenwidth, Vec3f color) //: Polygon()
{
this->mDimensions = lenwidth;
this->mColor = color;
}
Square::~Square() {
}
void Square::Collide(Polygon &p) {
}
/************/
/* PRIVATE */
/************/
void Square::Draw() {
const int numPoints = mDimensions.X * mDimensions.Y;
glBegin(GL_LINE_STRIP);
glColor3f(mColor.X, mColor.Y, mColor.Z);
for (double i = 0; i <= numPoints; i++) {
const float x = mDimensions.X;
const float y = mDimensions.Y;
glVertex3f(x, y, 0.0);
mDimensions.X += 1;
mDimensions.Y += 1;
}
}
vtable链接错误的原因是您没有定义类中的第一个虚拟函数(即Collide(Shape&p)
)。(vtables通常与第一个虚拟函数定义一起存储)
添加一个void Square::Collide(Shape &p)
函数(只需要一个空白的void Square::Collide(Shape &p) {}
就可以了),特定的vtable错误就会消失。
请注意,您可能应该定义头中的所有函数。
记住,参数类型区分函数就像C++中的名称一样,Collide(Shape)
不同于Collide(Polygon)
。
相关文章:
- 编译C++时未定义的引用
- 如何修复此错误:未定义对"距离(浮点数,浮点数,浮点数,浮点数,浮点数)"的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 未定义的引用在哪里
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 对Py_Initialize()的未定义引用
- 使用mysql c++连接器的未定义引用
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 对 Scalar ::Scalar() 的未定义引用
- 已定义函数时出现 G++ "未定义的引用"错误
- 链接 cmake 时出现未定义的引用错误
- 对复制 CTOR 和 CTOR 的未定义引用
- 错误:未定义对'oboe::AudioStreamBuilder::openStream(oboe::AudioStream**)'的引用
- 右值引用未定义的行为
- 对"vtable for DigitalClock"的未定义引用 - 未定义对"DigitalClock::staticMetaObject"的引用 - Qt
- 函数类型到函数类型的引用:未定义的引用
- avcodec_alloc_context引用未定义,但ffmpeg链接顺序正确
- 从c++调用Fortran子程序,链接时引用未定义
- 枚举引用未定义,但位于包含的头文件中