虚拟函数在C++中是否只能覆盖?

sof*_*sof 0 c# c++ polymorphism inheritance

在C#中,基类的虚方法可以被其派生类覆盖或隐藏,例如

using System;

class A {
 public virtual void M() {
  System.Console.WriteLine("A");
 }
}

class B: A {
 public override void M() {
  System.Console.WriteLine("B");
 }
}

class C: A {
 public new void M() {
  System.Console.WriteLine("C");
 }
}

class P {
 static void Main(string[] args) {
  A b = new B();
  b.M();
  A a = new C();
  a.M();
 }
}
Run Code Online (Sandbox Code Playgroud)

输出:

B
A
Run Code Online (Sandbox Code Playgroud)

在C++中怎么样?只能覆盖?

Arm*_*yan 5

[更新C++ 11]

从C++ 11开始,您可以使用该override关键字告诉编译器您打算覆盖基类虚函数.

void foo() override;
Run Code Online (Sandbox Code Playgroud)

如果没有override关键字但基类包含具有相同*签名的虚函数,则该函数仍会被覆盖.否则,隐藏.

[C++ 03的原始答案]

当然,您可以在C++中覆盖和隐藏虚函数.你只是不是很明确(不管怎么说都不是在C++ 03中).

class A
{
public:
   virtual int f(char);
};

class B : public A
{
public:
    virtual int f(); //hides A::f
};

class C : public A
{
public:
    virtual int f(char); //overrides A::f
};
Run Code Online (Sandbox Code Playgroud)

如果签名与Base虚方法*重合,那么它将覆盖.否则它就藏起来了.

所以有时候你不小心忘记了一个const 并最终隐藏了这个函数而不是覆盖它.调用C++ 11覆盖属性来解决此问题.如果使用此覆盖属性但签名不兼容,则会出现编译器错误.

*(或不同之处仅在于返回类型分别是对Base类和公共Derived类的指针或引用)