未强制执行 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++ 虚函数的主要内容,如果未能解决你的问题,请参考以下文章

深入理解C++ 虚函数表

C++ 子函数中的纯虚函数和未使用的参数

强制 Eclipse 为派生类中纯虚函数的实现提供存根

C ++:私有虚函数与纯虚函数[重复]

c++ 虚函数 如何调父类 而非子类

C++ 虚函数 (virtual function)