C ++虚函数未强制执行

时间:2014-03-17 00:15:31

标签: c++ visual-studio-2010 function class inheritance

我有一个接口类(参见第一个代码块),实现(参见第二个代码块)没有产生错误,即使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 );
    */
};

2 个答案:

答案 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 ++允许您定义这些中间类以便在类层次结构中使用,但是不要自己实例化。

我所描述的示例改进了代码重用(尽管需要付费),理想情况下,使代码更容易维护(这是有争议的!)。在开始编写这样的代码之前,请仔细查看您的问题并尝试找到一个更简单的解决方案;这种事情会给你和你的同事带来严重的麻烦。