我已经在这里检查了最常见的undefined reference to vtable
问题,虽然这让我对正在发生的事情有了更好的了解,但我仍然无法收集足够的信息来弄清楚我为什么会这样做有这个错误。
我有一个简单的Square类,最初我试图从Polygon类继承。由于我对C ++已经相对了解并且还在学习,所以我还没有尝试过多态性。
无论如何,在我试图摆脱基类(Polygon
)后,我认为这可能有所帮助。不幸的是,我仍然遇到同样的错误,我不知道发生了什么。我所知道的是,最初,Polygon
类需要一个源文件,其中至少是一个构造函数定义,我给了它。这消除了vtable
类的Polygon
错误。
我的主要问题是我仍在为Square
类获取此内容,该类应该从Polygon类继承。我想知道的是如何正确实现这一点以避免在获得多态性的好处的同时出现vtable
错误?
代码
Polygon.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() {
}
* Square.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;
}
}
答案 0 :(得分:5)
vtable链接错误的原因是您没有在类中定义第一个虚函数(Collide(Shape&p)
)。 (vtable通常与第一个虚函数定义一起存储)
添加void Square::Collide(Shape &p)
函数(只有一个空白void Square::Collide(Shape &p) {}
应该有效),并且该特定的vtable错误应该消失。
请注意,您可能应该定义标题中的所有函数。
请记住,参数类型与C ++中的名称区分函数,Collide(Shape)
与Collide(Polygon)
不同。