2009-11-27 8 views
0

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(); 
}; 
+0

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

+0

Appelez-vous la fonction virtuelle dans un constructeur? Si c'est le cas, c'est probablement votre problème. – strager

+0

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

Répondre

1

Ok je viens tout recompilé et cela a fonctionné. Je ne sais pas ce qui s'est mal passé. Merci pour vos suggestions.

Vérifiez vos dépendances. Je parie que quelque chose qui devrait dépendre d'un fichier d'entête ne l'est pas. Lorsque vous avez effectué une génération propre, le fichier de code source qui s'est appuyé sur ce fichier d'en-tête a été mis à jour.

0

Je viens de re-compilé tout et il travaillé

Je suppose la classe de base abstraite a été déclarée dans un binaire (par exemple, dans une dll sur les fenêtres) et la classe dérivée était en un autre. Dans ce cas, si vous ne recompilez pas le binaire contenant la classe dérivée, vtable ne sera pas configuré correctement et les appels commenceront à se comporter bizarrement et comme @Strager l'a dit, vous devez avoir le destructeur virtuel dans la classe de base.

Questions connexes