2009-11-27 83 views
0

我有一个PointCamera用作其超类的抽象类,称为相机。出于某种原因,其中一个虚拟函数在调试器中引发错误,并告诉我它试图执行0x00000000。只有当这个函数是抽象类中声明的最后一个时才会发生这种情况。如果我切换声明顺序,那么新的最后一个函数将不会出于同样的原因。这是为什么发生?为什么我的虚拟功能不起作用?

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; 
}; 

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

重现错误的最小代码段会很好。看起来你在尝试调用函数时做了一些奇怪的事情,或者你设法使vtable无法正确初始化。 – Donnie 2009-11-27 04:17:13

+0

你在调用构造函数中的虚函数吗?如果是这样,那可能是你的问题。 – strager 2009-11-27 04:18:20

+0

好吧,我只是重新编译一切,它的工作。我不知道哪里出了问题。感谢您的建议。 – Stewart 2009-11-27 04:26:26

回答

1

好吧,我只是重新编译的一切,它的工作。我不知道哪里出了问题。感谢您的建议。

检查您的依赖关系。我敢打赌,应该取决于头文件的东西不是。当你做了一个干净的构建时,依赖于该头文件的源代码文件被更新了。

0

我只是重新编译的一切,这 工作

所以我认为抽象基类是在一个二进制文件(例如,在Windows上一个DLL)和派生类在声明另一个。在这种情况下,如果你不重新编译包含派生类的二进制文件,它的vtable将无法正确设置,并且调用将开始异常行为,正如@Strager所说的,你需要在基类中拥有虚拟析构函数。

相关问题