繁体   English   中英

为什么我的虚拟功能不起作用?

[英]Why isn't my virtual function working?

我有一个名为camera的抽象类,PointCamera将其用作其超类。 由于某种原因,其中一个虚拟函数在调试器中引发错误,并告诉我它正在尝试执行0x00000000。 仅当所讨论的函数是抽象类中声明的最后一个函数时,才会发生这种情况。 如果我切换声明顺序,则由于相同的原因,新的last函数将无法工作。 为什么会这样呢?

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

好的,我只是重新编译了所有内容,并且一切正常。 我不知道出了什么问题。 感谢您的建议。

检查您的依赖项。 我敢打赌应该不取决于头文件的东西。 进行干净构建时,依赖于该头文件的源代码文件已更新。

我只是重新编译了所有内容,但效果很好

因此,我假设抽象基类在一个二进制文件中声明(例如,在Windows上的一个dll中),而派生类在另一个二进制文件中声明。 在这种情况下,如果不重新编译包含派生类的二进制文件,则不会正确设置vtable,并且调用将变得异常,正如@Strager所说,您需要在基类中具有虚拟析构函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM