Здесь я проверил самый распространенный неопределенный вопрос о 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;
}
}