虚拟关键字在重写方法时是什么意思?

问题描述 投票:12回答:4

重载方法时关键字virtual会做什么?我没有使用它,一切正常。

每个编译器在这方面的行为是否相同?

我是否应该使用它?

c++ virtual-functions
4个回答
10
投票

没有它就无法覆盖成员函数。

您只能隐藏个。

struct Base {
   void foo() {}
};

struct Derived : Base {
   void foo() {}
};

Derived::foo是否不是覆盖Base::foo;它只是hides,因为它具有相同的名称,例如以下名称:

Derived d;
d.foo();

调用Derived::foo

[virtual启用多态性,以便您actually覆盖函数:

struct Base {
   virtual void foo() {}
};

struct Derived : Base {
   virtual void foo() {} // * second `virtual` is optional, but clearest
};

Derived d;
Base& b = d;
b.foo();

这将调用Derived::foo,因为现在是overrides >> Base::foo-您的对象是多态的。

(由于[C​​0],您也拥有

为此使用引用或指针。]
  • the slicing problem不需要重复Derived::foo关键字,因为virtual已经使用过它。这是标准所保证的,您可以依靠它。但是,有些人认为最好还是保持清晰。

8
投票

基类中的Base::foo方法将在层次结构中级联,从而使每个具有相同签名的子类方法也变为virtual


6
投票

[当一个函数是虚拟的时,无论您是否每次都明确指定它都是虚拟的,它在整个层次结构中都是虚拟的。覆盖方法时,请使用virtual以便更明确-没有其他区别:)


0
投票

扩展为轻量级比赛的答案,也许这将有助于某些人了解它的作用。

© www.soinside.com 2019 - 2024. All rights reserved.