考虑从基础结构Triangle
继承的两个几何Line
和Geometry
。派生结构继承虚拟函数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. */}
};
答案 0 :(得分:0)
假设你保持现有设计,尽管Joachim Pileborg解释了这个缺陷:
该方法的可能实现是:
double Triangle::get_area() override
{
assert(false);
return 0.;
}
动机:
在调试模式下,如果条件为false,assert(condition);
将退出程序。假设你有你的IDE&调试器,您将能够看到谁调用了该方法。
但是,在常规发布版本中,断言已停用。 return 0.;
确保返回有意义的内容
(注意:这可能会因您使用区域值的方式而改变.NAN可能是一个不错的选择。)
注意:
问题必然会在运行时弹出,因为您使用的是虚拟方法。这是一种设计气味,可以通过多种方式解决(将线的区域定义为0,创建中间类Shape1D和Shape2D,......)
获取调用者,即仅从代码调用堆栈在C ++中比Java之类的语言更难。获取它是实现定义的,以及获取方法的人类可读名称。但是,处于调试模式+具有调试器(大多数IDE都是这种情况)允许您轻松地执行此操作。