是否应该将实现接口类的纯虚方法的方法声明为虚拟?

时间:2010-10-26 14:04:53

标签: c++ interface methods virtual

我读到了关于这个问题的不同意见。假设我有一个带有一堆纯虚方法的接口类。我在实现接口的类中实现这些方法,我不希望从实现中派生出来。

是否需要将实现中的方法声明为虚拟?如果是,为什么?

7 个答案:

答案 0 :(得分:9)

否 - 在基类中声明为virtual的每个函数方法在所有派生类中都是虚拟的。

但良好的编码实践告诉我们将这些方法声明为虚拟。

答案 1 :(得分:7)

真正的需要 - 没有。一旦方法在基类中声明为虚拟,它就会为所有派生类保持虚拟。但是知道哪个方法是虚拟的以及哪个方法是好的 - 而不是在基类中检查它。此外,在大多数情况下,您无法确定是否会导出您的代码(例如,如果您正在为某个公司开发某些软件)。正如我所说,这不是问题,因为一旦声明为虚拟,它就会保持虚拟,但以防万一......(:

答案 2 :(得分:7)

virtual在派生类覆盖声明中是可选的,但为了清楚起见,我个人将其包括在内。

答案 3 :(得分:5)

无需将其标记为虚拟。

我首先讨论虚拟广告向读者宣传派生类覆盖虚拟做一些有用的事情。如果要实现虚拟操作,那么虚拟方法可能与您的类的类型无关:在这种情况下将虚拟标记为虚拟。考虑:

class CommsObject {
   virtual OnConnect();
   virtual OnRawBytesIn();
};

class XMLStream : public CommsObject {
    virtual OnConnect();
            OnRawBytesIn();
    virtual OnXMLData();
};

在该示例中,OnConnect在两个类中都被记录为虚拟,因为后代总是想知道它是有意义的。 OnRawBytesIn对XMLStream中的“Export”没有意义,因为它使用它来处理原始字节,并生成解析数据 - 它通过OnXMLData()进行通知。

完成所有这些后,我认为第三类的维护者,看着XMLStream,可能会认为创建自己的OnRawBytes函数并期望它作为正常的重载函数工作是“安全的” - 即基类将调用内部正确的基类,而外基类将屏蔽内部的OnRawBytes。

因此,省略虚拟隐藏了类的消费者的重要细节,并使代码以意想不到的方式运行。

所以我已经完全循环:不要试图将它用作关于函数预期目的的暗示 - 将其用作关于函数行为的提示:将函数标记为一致,以便下游程序员必须阅读更少的文件,以了解函数在被覆盖时的行为方式。

答案 4 :(得分:4)

不,它不是必需的,并且它不会阻止任何编码错误,尽管很多编码员都喜欢这样做。

一旦C ++ 0x成为主流,您就可以使用override说明符了。

答案 5 :(得分:2)

一旦'虚拟',它一直虚拟到最后一个孩子。 Afaik,这是c ++的特色。

答案 6 :(得分:1)

如果你从不从一个类派生,那么将其方法设为虚拟是没有意义的。