Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;虚拟功能未强制执行_C++_Visual Studio 2010_Function_Class_Inheritance - Fatal编程技术网

C++ C++;虚拟功能未强制执行

C++ C++;虚拟功能未强制执行,c++,visual-studio-2010,function,class,inheritance,C++,Visual Studio 2010,Function,Class,Inheritance,我有一个接口类(请参见第一个代码块),实现(请参见第二个代码块)不会生成错误,即使没有定义CreateMessage()。。。我完全糊涂了,因为就我看来这本不应该编译 哦,在Microsoft 7上使用Visual Studio 2010。。。以前有人见过这个,或者我的代码中有bug吗 代码块1: namespace Common { namespace Messaging { class iNetworkMessageFactory { public: // +--------

我有一个接口类(请参见第一个代码块),实现(请参见第二个代码块)不会生成错误,即使没有定义CreateMessage()。。。我完全糊涂了,因为就我看来这本不应该编译

哦,在Microsoft 7上使用Visual Studio 2010。。。以前有人见过这个,或者我的代码中有bug吗

代码块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 );
    */
};
#包括
类NetworkMessageFactory:public Common::Messaging::iNetworkMessageFactory
{
公众:
//  +----------------------------------------------------------------------
//+说明:NetworkMessageFactory类构造函数。
//  +----------------------------------------------------------------------
NetworkMessageFactory();
//  +----------------------------------------------------------------------
//+说明:NetworkMessageFactory类析构函数。
//  +----------------------------------------------------------------------
~NetworkMessageFactory();
/*
//  +----------------------------------------------------------------------
//+说明:创建网络消息。
//  +----------------------------------------------------------------------
iNetworkMessage*CreateMessage(NetworkMessageType类型ID
,iNetMsgBody*正文
,ConnectionID-connID);
*/
};

这很好,不应该产生错误。否则,您将无法拥有多个抽象祖先。如果尝试调用纯虚拟函数,将出现运行时错误


例如,C++允许您对NETWorkMeXeFr工厂进行子类,并在派生类中提供纯虚拟函数的实现。没有理由强制NetworkMessageFactory类本身存在实现。

这是允许的,但您将无法实例化NetworkMessageFactory类,因为尚未定义纯虚拟方法CreateMessage

考虑以下情况:您有一个纯虚拟基类“a”,它有两个纯虚拟方法:do_work和do_more_work。假设您还有两个类,B和C,它们具有相同的“do_work”实现,但具有不同的“do_more_work”实现。然后有一个名为“D”的类,它的“do_more work”实现与C相同,但“do_work”实现不同

复杂?对但是在这种假设的情况下,您可以创建中间类来定义虚拟方法的共享实现,然后让A、B、C和D继承这些定义。这些中间类不一定对“doiWork”和“dojMulyWorks'都有定义,所以C++允许您定义这些类以用于类层次结构,但不能自己实例化它们。


我所描述的示例改进了代码重用(尽管代价很高),并且理想情况下使代码更易于维护(这是有争议的!)。在您开始编写这样的代码之前,仔细研究一下您的问题,并尝试找到一个更简单的解决方案;这类事情可能会让您和您的同事非常头疼。

我的理解是,通过声明虚拟纯成员函数,它必须由继承的类实现?我并不是说你错了,因为我很困惑,只是想了解情况;)不,它根本不需要实现。正如Liam所提到的,尝试实例化一个具有纯虚拟的类时会出现编译时错误……但是可能会在指针上出错并调用纯虚拟,在这种情况下会出现运行时错误。