虚函数给出错误

Giving error in virtual function

本文关键字:错误 出错 函数      更新时间:2023-10-16

考虑继承基础结构Geometry的两个几何形状TriangleLine。派生结构继承虚函数get_area(),使得Triangle正常计算面积,但Line给出get_area()Line不相关的错误。当显示错误时,我想知道哪个结构称为get_area(),在哪里(行号),并最终终止程序。无论错误是在编译时显示还是在运行时显示都无关紧要。我该怎么做呢?

struct Geometry
{
    virtual double get_area() = 0;
};
struct Triangle: Geometry
{
    double get_area() override {/* some code. */}
};
struct Line: Geometry
{
    double get_area() override {/* give error. */}
};

假设您保持当前的设计,尽管Joachim Pileborg解释了缺陷:

该方法的一个可能实现是:

double Triangle::get_area() override
{
    assert(false);
    return 0.;
}

动机:

在调试模式下,如果条件为false, assert(condition);将退出程序。假设你有你的IDE &调试器,您将能够看到谁调用了该方法。

然而,在常规的发布版本中,断言是不激活的。return 0.;确保返回一些有意义的东西。
(注意:这可能会因你如何使用面积值而改变。NAN可能是一个不错的选择)。

指出:

  • 这个问题必然会在运行时弹出,因为你正在使用虚拟方法。这是一种设计气味,可以通过几种方式解决(将线的面积定义为0,创建中间类Shape1D和Shape2D,…)

  • 在c++中获取调用者,即仅从代码中获取调用堆栈比Java等语言更难。获取它是实现定义的,以及获取人类可读的方法名称。但是,在调试模式下加上调试器(大多数IDE都是这种情况)可以让您轻松地完成此操作。

相关文章: