未强制执行 C++ 虚函数
Posted
技术标签:
【中文标题】未强制执行 C++ 虚函数【英文标题】:C++ Virtual Function not enforced 【发布时间】:2014-03-17 00:15:30 【问题描述】:我有一个接口类(见第一个代码块),实现(见第二个代码块)不会产生错误,即使 CreateMessage() 没有定义......我完全困惑,因为就我看到这不应该编译。
哦,在 Microsoft 7 上使用 Visual Studio 2010...有人以前见过这个,或者我的代码中有错误吗?
代码块 1:
namespace Common
namespace Messaging
class iNetworkMessageFactory
public:
// +----------------------------------------------------------------------
// + Description : iNetworkMessageFactory class destructor.
// +----------------------------------------------------------------------
virtual ~iNetworkMessageFactory()
// +----------------------------------------------------------------------
// + Description : Create a network message.
// +----------------------------------------------------------------------
virtual iNetworkMessage *CreateMessage() = 0;
;
// Namespace Common
// Namespace Messaging
代码块 2:
#include <Messaging/iNetworkMessageFactory.h>
class NetworkMessageFactory : public Common::Messaging::iNetworkMessageFactory
public:
// +----------------------------------------------------------------------
// + Description : NetworkMessageFactory class constructor.
// +----------------------------------------------------------------------
NetworkMessageFactory();
// +----------------------------------------------------------------------
// + Description : NetworkMessageFactory class destructor.
// +----------------------------------------------------------------------
~NetworkMessageFactory();
/*
// +----------------------------------------------------------------------
// + Description : Create a network message.
// +----------------------------------------------------------------------
iNetworkMessage *CreateMessage( NetworkMessageType typeID
, iNetMsgBody *body
, ConnectionID connID );
*/
;
【问题讨论】:
【参考方案1】:这很好,应该不会产生错误。否则,您将无法拥有多个抽象祖先。如果您尝试调用纯虚拟,则会收到运行时错误。
例如,C++ 允许您继承 NetworkMessageFactory 并在派生类中提供纯虚函数的实现。没有理由强制 NetworkMessageFactory 类本身存在实现。
【讨论】:
我的理解是,通过声明一个虚纯成员函数,它必须由继承的类来实现?我并不是说你错了,因为我很困惑,只是想理解这个场景;) 不,它根本不需要实现。正如利亚姆所提到的,您将在尝试实例化具有纯虚拟的类时遇到编译时错误......但指针可能会出错并调用纯虚拟,在这种情况下您将收到运行时错误.【参考方案2】:这是允许的,但您将无法实例化类 NetworkMessageFactory,因为尚未定义纯虚方法 CreateMessage。
考虑以下情况:您有一个纯虚基类“A”,它有两个纯虚方法:do_work 和 do_more_work。假设您还有两个类,B 和 C,它们具有相同的“do_work”实现,但具有不同的“do_more_work”实现。然后,您有一个名为“D”的类,它与 C 具有相同的“do_more work”实现,但具有不同的“do_work”实现。
复杂?是的。但是在这种假设情况下,您可以创建中间类来定义虚拟方法的共享实现,然后让 A、B、C 和 D 从它们那里继承这些定义。这些中间类不一定对“do_work”和“do_more_work”都有定义,因此 C++ 允许您定义这些中间类以在类层次结构中使用,但不能自行实例化它们。
我描述的示例改进了代码重用(尽管需要付出代价),并且理想情况下,使您的代码更易于维护(这是有争议的!)。在开始编写这样的代码之前,请仔细检查您的问题并尝试找到更简单的解决方案;这种事情可能会让您和您的同事非常头疼。
【讨论】:
以上是关于未强制执行 C++ 虚函数的主要内容,如果未能解决你的问题,请参考以下文章