C++ C++;虚拟功能未强制执行
我有一个接口类(请参见第一个代码块),实现(请参见第二个代码块)不会生成错误,即使没有定义CreateMessage()。。。我完全糊涂了,因为就我看来这本不应该编译 哦,在Microsoft 7上使用Visual Studio 2010。。。以前有人见过这个,或者我的代码中有bug吗 代码块1: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: // +--------
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所提到的,尝试实例化一个具有纯虚拟的类时会出现编译时错误……但是可能会在指针上出错并调用纯虚拟,在这种情况下会出现运行时错误。