当前位置: 首页 > 知识库问答 >
问题:

对虚拟基类析构函数的“未定义引用”[重复]

傅泉
2023-03-14
    class Force {

    public:

    virtual ~Force();
    virtual VECTOR eval(VECTOR x, double t);

};

class InvSquare : public Force {

    public:

    InvSquare(double A) {

        c = A;

    }

    ~InvSquare(){};

    VECTOR eval(VECTOR x, double t) { // omitted stuff }

    private:
    double c;

};

非常感谢你的帮助,noctilux

共有1个答案

阎卓
2023-03-14

您已经声明了析构函数,但没有定义它。将声明更改为:

virtual ~Force() {}

把它定义为什么都不做。

您还希望使抽象接口中的所有函数都是纯虚拟的,否则它们也需要定义:

virtual VECTOR eval(VECTOR x, double t) = 0;
 类似资料:
  • 当接口包含纯虚方法时,建议使用虚拟析构函数。例如,我有这样的代码: 但是,当我试图用g为Arduino Due编译时,我得到了以下错误: 然而,当我将析构函数从一个整体中删除时,它会删除错误,但这不会导致未反馈的行为吗?此外,当我刚刚从的析构函数中删除virtual关键字时,它会给我相同的错误消息。

  • 我得到一个 据我所知,构造函数是被定义的,但是编译器显然看不到它。我唯一的结论是存在某种包含问题(例如,循环包含)。 我已经为下面的每个翻译单元制作了一个包含图,但是我看不出有任何问题。任何指导都将不胜感激。 包括:

  • 我终于绝望了。所以,在我的c课上,我们被指示使用类。我们会让头文件声明类和函数,而另一个单独的. cpp文件实现它。事情应该是有效的,但他们没有,网上没有解决方案似乎对我有用。为此,我在linux上使用了G编译器,它似乎在IDE或普通命令行上都无法工作。 我在笔记本上看到的错误。h是这样的: 我有点不喜欢该文件没有接收任何电话类的方法。下面是TBook的代码。h: 这就是TBook.cpp的样子:

  • 我读过一些文章,正如他们所说,主要的虚拟析构函数用例是: > 派生类可能具有来自堆的动态数据分配,即“拥有”该数据对象。所以,他们需要在析构函数中使用一些删除例程。通过基类指针删除需要在所有派生类中声明析构函数,直到那些具有动态数据分配的析构函数(基类也需要它) 此类具有< code >虚拟方法。但这对我来说不清楚。仅仅通过基类指针调用< code >虚拟方法总是会导致派生实现最多的调用。他们唯一

  • 每个人都知道基类的分解器通常必须是虚拟的。但是派生类的析构函数是什么?在 C 11 中,我们有关键字“override”,并且能够显式使用默认析构函数。 在子类的析构函数中同时使用关键字“覆盖”和“=默认”是否正确?在这种情况下,编译器会生成正确的虚拟析构函数吗? 如果是,那么我们是否可以认为这是好的编码风格,我们应该总是这样声明派生类的析构函数,以确保基类析构函数是虚的?

  • 我理解,只要你有一个多态基类,基类就应该定义一个虚拟析构函数。因此,当删除指向派生类对象的基类指针时,它将首先调用派生类的析构函数。如果我错了,请纠正我。 此外,如果基类析构函数是非虚拟的,那么删除指向派生对象的基类指针将是未定义的行为。如果我错了也纠正我。 所以我的问题是:为什么当基类析构函数非虚拟时,对象不会被正确销毁? 我假设这是因为虚拟函数具有某种表,每当调用虚拟函数时都会记住和查阅该表。