J'ai une classe abstraite appelée caméra que PointCamera utilise comme super classe. Pour une raison quelconque, l'une des fonctions virtuelles lance une erreur dans le débogueur et me dit qu'elle essaie d'exécuter 0x00000000. Cela ne se produit que si la fonction en question est la dernière déclarée dans la classe abstraite. Si je change d'ordre de déclaration, la nouvelle dernière fonction ne fonctionnera pas pour la même raison. Pourquoi cela arrive-t-il?Pourquoi ma fonction virtuelle ne fonctionne-t-elle pas?
class Camera
{
public:
//Default constructor
Camera();
//Assignment operator
virtual Camera* clone() = 0;
//Get a ray
virtual void KeyCamera() = 0;
virtual void GetRay(float x, float y, Ray* out) = 0;
};
et
class PointCamera: Camera
{
private:
//Camera location, target, and direction
Vector loc, dir, tar, up;
//Orthonormal vectors
Vector u, v, w;
//Virtual plane size
float plane_width, plane_height;
int width, height;
//Distance from the camera point to the virtual plane
float lens_distance;
//Pixel size
float pixelSizex, pixelSizey;
public:
//Default constructor
PointCamera();
//Constructors
PointCamera(Vector& iloc, Vector& itar);
PointCamera(Vector& iloc, Vector& itar, Vector& idir);
//Destructor
~PointCamera();
//Modifiers
void SetDirection(Vector& idir);
void SetUp(Vector& iup);
void SetTarget(Vector& itar);
void SetLocation(Vector& iloc);
void SetPlane(int iheight, int iwidth, float iplane_width = -1.0f, float iplane_height = -1.0f);
void SetLensDistance(float ilens_distance);
//Implememented method
virtual void GetRay(float x, float y, Ray* out);
virtual void SetupRay(Ray* out);
//Compute orthonormal vectors
virtual void KeyCamera();
};
Un extrait de code minimal qui reproduit l'erreur serait bien. Il semble que vous fassiez quelque chose de bizarre en essayant d'appeler la fonction, ou que vous ayez réussi à faire que le vtable ne soit pas initialisé correctement. – Donnie
Appelez-vous la fonction virtuelle dans un constructeur? Si c'est le cas, c'est probablement votre problème. – strager
Ok, je viens de recompiler tout et ça a marché. Je ne sais pas ce qui s'est mal passé. Merci pour vos suggestions. – Stewart