【发布时间】:2011-10-14 04:05:21
【问题描述】:
我找到了一些我正在处理的代码,并且想知道最好的设计实现是什么。
如果一个基类定义了一个虚方法,但也实现了一个空体,因此派生类不需要实现一个体,难道不应该改为纯方法吗?
virtual void AMethod1() {} // 1
virtual void AMethod2() {assert(false);} // 2
virtual void AMethod3() = 0; // 3
- 当前代码。
- Idea1:提醒用户此派生对象尚未实现此方法主体。
- Idea2:强制派生类实现一个主体,无论是否为空。
你们这些值得信赖的、了不起的 SO 人是怎么想的?
Edit1:发布(并阅读答案)后,我意识到断言很糟糕!
virtual void AMethod3() = {throw (ENotImplemented)}; // 4
【问题讨论】:
-
请注意,您实际上可以拥有一个带有主体的纯虚方法(它不能是内联的)。
-
您能否详细说明为什么您认为
assert比例外更糟糕?在手头的情况下,我觉得它非常合适:如果必须始终重写方法并且从不实例化基类,那么应该从不调用默认实现,这是程序的不变量(不是可以异常发生的事件)。当然,如果有这些要求,最好将方法设为纯虚拟。 -
@Let_Me_Be 谢谢你,我认为 larsmans 用你所说的例子给出了答案......
-
@Luc Touraille 也许是因为
assert()仅在调试模式下检查,所以通常在发布版本中关闭。 -
@Archie:我不确定这是否真的是一个问题,因为断言仅在开发期间有用(它针对扩展基类的开发人员)。它用于警告开发人员他们的设计中存在错误,一旦更正了断言就不应被触发,因此之后将其关闭应该没有害处。
标签: c++ methods derived-class pure-virtual