覆盖方法时,虚拟关键字是什么意思?

| 覆盖方法时,关键字virtual有什么作用?我没有使用它,一切正常。 在这方面,每个编译器的行为都一样吗? 我是否应该使用它?     
已邀请:
        没有它,您将无法覆盖成员函数。 您只能隐藏一个。
struct Base {
   void foo() {}
};

struct Derived : Base {
   void foo() {}
};
Derived::foo
不会覆盖
Base::foo
;它只是将其隐藏,因为它具有相同的名称,例如:
Derived d;
d.foo();
调用
Derived::foo
virtual
启用多态,以便您实际上覆盖函数:
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
,因为它现在将覆盖
Base::foo
-您的对象是多态的。 (由于切片问题,您还必须为此使用引用或指针。)
Derived::foo
不需要重复to5ѭ关键字,因为
Base::foo
已经使用过它。这是标准所保证的,您可以依靠它。但是,有些人认为最好还是保持清晰。     
        基类中的“ 5”方法将在层次结构中级联,从而使每个具有相同签名的子类方法也变为“ 5”。
class Base{
public:
  virtual void foo(){}
};

class Derived1 : public Base{
public:
  virtual void foo(){} // fine, but \'virtual\' is no needed
};

class Derived2 : public Base{
public:
  void foo(){} // also fine, implicitly \'virtual\'
};
如果仅出于文档目的,我建议编写ѭ5。     
        当一个函数是虚拟的时,无论您是否每次都明确指定它是虚拟的,它在整个层次结构中都是虚拟的。覆盖方法时,请使用virtual以便更明确-没有其他区别:)
class A
{
    virtual void f() 
    {
      /*...*/
    };
};

class B:public A;
{
    virtual void f()  //same as just void f()
    {
        /*...*/
    };
};
    
        扩展Light Races的答案,也许这将有助于某些人了解它在做什么。
struct Base {
public:
    void foo() {
        printf_s(\"Base::foo\\n\");
    }
};

struct Derived : Base {
    void foo() {
        printf_s(\"Derived::foo\\n\");
    }
};

struct BaseVirtual {
public:
    virtual void foo() {
        printf_s(\"BaseVirtual::foo\\n\");
    }
};

struct DerivedVirtual : BaseVirtual {
    virtual void foo() {
        printf_s(\"DerivedVirtual::foo\\n\");
    } 
};

Derived d;
d.foo(); // Outputs: Derived::foo

Base& b = d;
b.foo(); // Outputs: Base::foo

DerivedVirtual d2;
d2.foo(); // Outputs: DerivedVirtual::foo

BaseVirtual& b2 = d2;
b2.foo(); // Outputs: DerivedVirtual::foo

    

要回复问题请先登录注册