我有一个接口类(参见第一个代码块),实现(参见第二个代码块)没有产生错误,即使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 );
*/
};
答案 0 :(得分:1)
没关系,不应该生成错误。否则,您将无法拥有多个抽象祖先。如果您尝试调用纯虚拟域,则会收到运行时错误。
例如,C ++允许您子类化NetworkMessageFactory并在派生类中提供纯虚函数的实现。没有理由在NetworkMessageFactory类本身中强制执行实现。
答案 1 :(得分:1)
这是允许的,但是您将无法实例化NetworkMessageFactory类,因为尚未定义纯虚方法CreateMessage。
考虑以下情况:您有一个纯虚拟基类&#39; A&#39;,它有两个纯虚拟方法:do_work和do_more_work。我们假设您还有两个类,B和C,它们具有相同的&#39; do_work&#39;的实现,但是有一个不同的实现&#39; do_more_work&#39;。然后你有一个名为“D&#39;”的课程,它具有相同的实施工作&#39; do_more work&#39;作为C,但是不同的“do_work&#39;”实现。
卷积?是。但是在这个假设的情况下,您可以创建定义虚拟方法的共享实现的中间类,然后让A,B,C和D从它们继承这些定义。这些中级类不一定有“do_work”和“do_more_work”的定义,因此C ++允许您定义这些中间类以便在类层次结构中使用,但是不要自己实例化。
我所描述的示例改进了代码重用(尽管需要付费),理想情况下,使代码更容易维护(这是有争议的!)。在开始编写这样的代码之前,请仔细查看您的问题并尝试找到一个更简单的解决方案;这种事情会给你和你的同事带来严重的麻烦。