是否有任何理由声明一个没有继承的虚拟方法?
问题描述:
如果某个类没有子类并且总是直接使用,是否有任何理由声明方法virtual
?是否有任何理由声明一个没有继承的虚拟方法?
例如:
class Foo {
public:
virtual void DoBar {
// Do something here.
}
}
我碰到这在一些代码,我正在读来了,找不到任何理由。
谢谢!
答
编写库代码时,记住未来的程序员可能想要扩展类并提供自己的行为,这很有用。例如,通常在GUI库中具有虚拟Paint()
函数或虚拟鼠标处理函数。它们提供默认实现,但它们允许扩展的可能性。
答
如果这个类是从那里派生出来的话,那么它是有道理的。在决定程序的体系结构时,应该做出这些决定,并定义可以对接口做些什么。如果他们不希望这个来源于此,那么它不应该是虚拟的。如果他们确实希望它从那里派生出来,那么它应该是虚拟的(并且它也应该使析构器变为虚拟的)。
+0
你说“如果他们不想让它从那里派生出来,它不应该是虚拟的”,但是一个非虚拟方法不会阻止派生类重写它,它只是意味着新方法不能通过基类来使用指针。如有必要,派生类可以调用基类方法。 – Tony
如果你不使用'final',当然。例如,你几乎*拥有*来声明析构函数。你无法预测未来。不要使用final,这会锁定将来并显示你曾经想过。就像“虚拟”表明你曾经想过。 –
@HansPassant使用**虚拟**并不一定表明你“想过它”。根据我的经验,我已经看到开发人员使用**虚拟**作为默认值,因为他们无法考虑这个问题。地狱,当我第一次学习Java时,它将这种方法推向了极致,所有方法都默认为虚拟的,甚至没有被标记为这样!它的目标似乎完全消除了思想。 –