我应该在运行时还是编译时强制执行C ++接口?

时间:2015-12-22 14:51:35

标签: c++ oop

我在Nmap's source code中找到了这个:

/** This function MUST be overwritten on ANY class that inherits from          
  *  this one. Otherwise getBinaryBuffer will fail */                          
virtual u8 * getBufferPointer(){                                               
    netutil_fatal("getBufferPointer(): Attempting to use superclass PacketElement method.\n");
    return NULL;                                                               
 } /* End of getBufferPointer() */                                             

如果getBufferPointer是纯虚拟的,那么任何未能实现它的派生类都将在编译时被捕获。为什么选择运行时错误而不是编译器触发错误会更好?

2 个答案:

答案 0 :(得分:2)

在编译时错误中,永远不应该更喜欢运行时错误,特别是当语言提供了一种更简单的方法来完成您想要的操作时,这也会给编译器带来错误。在我5年多的C ++编码中,我从未遇到过用你的方法创建方法的理由。

运行时错误=许多可能的原因,我需要自己的调试语句才能找到它。可能还需要多次运行程序。在您的情况下,我可能有其他类无法覆盖该方法,这可能会导致某些未定义点的错误。

编译时间错误=一个原因,我的编译器告诉我发生了什么。

答案 1 :(得分:1)

让它变得纯粹虚拟,即

 virtual u8 * getBufferPointer() = 0;

以便从其父类(PacketElement)派生的任何子类都应该重新定义它。