c++ - 提供虚函数错误

标签 c++ error-handling virtual-functions

考虑从基础结构Triangle继承的两个几何形状LineGeometry。派生的结构继承了虚函数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.;
}

动机:

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

但是,在常规发行版本中,断言被停用。 return 0.;确保返回有意义的内容。
(注意:这可能会因您使用面积值而改变。NAN可能是一个不错的选择)。

笔记:
  • 因为使用的是虚拟方法,所以该问题必然会在运行时 pop 。这是一种设计异味,可以通过几种方法解决(将线的面积定义为0,创建中介类Shape1D和Shape2D,...)
  • 在C++中,获取调用者(即仅来自代码的调用堆栈)比Java之类的语言困难。获取它是实现定义的,以及获取人类可读的方法名称。但是,处于 Debug模式+拥有调试器(大多数IDE就是这种情况),您可以轻松完成此操作。
  • 关于c++ - 提供虚函数错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39144054/

    相关文章:

    delphi - 如何在Delphi XE2中查找 “List index out of bounds”错误的位置

    python - 尝试在 flask 上插入时无法解码json对象

    c++ - 以下转发声明的多继承指针转换代码如何工作?

    c++ - 为什么这个 Qt 示例使用地址而不是对象和函数本身?没有 SLOT/SIGNAL 关键词?

    c++ - 霍夫曼编码 - 伪 EOF

    c++ - qt - 在父窗口/小部件类中初始化子小部件的目的是什么?

    c++ - Lambda 表达式、共享指针和 this 的类型

    optimization - Adam 优化器错误 : one of the variables needed for gradient computation has been modified by an inplace operation

    c++ - 虚函数上下文中的支配是什么?

    c++ - 为什么不从不同的继承分支覆盖纯虚方法?