具有不同参数类型的虚拟表

时间:2015-11-16 11:08:31

标签: c++ override virtual-functions method-signature

class Base {
  public:
    virtual void f(float) { cout << "Base::f(float)\n"; }
};

class Derived : public Base {
  public:
    virtual void f(int) { cout << "Derived::f(int)\n"; }
};

int main() {
  Derived *d = new Derived();
  Base *b = d;
  b->f(3.14F);
  d->f(3.14F);
}

根据我的理解,Derived类的虚拟表是:

+-----------------+
| Base::f(float)  |
+-----------------+
| Derived::f(int) |
+-----------------+

但是,该程序输出:

Base::f(float)
Derived::f(int)

为什么这两个输出的结果不同?我认为bd应该指向同一个虚拟表。

1 个答案:

答案 0 :(得分:3)

这与vtable没有任何关系。在这种情况下,Derived::f 覆盖Base::f,它声明了一个隐藏Base::f的新函数。

您可以使用合格的电话直接在Base::f个实例上致电Derived

d->Base::f(3.14F);

或者您可以使用Base::f指令公开using

class Derived : public Base {
  public:
    using Base::f;
    virtual void f(int) { cout << "Derived::f(int)\n"; }
};

使用using指令,将考虑intfloat版本:

d->f(3.14F); //calls Base::f
d->f(3);     //calls Derived::f

C ++ 11引入了override说明符来帮助诊断此类问题。如果您进行了以下更改:

 void f(int) override { cout << "Derived::f(int)\n"; }

然后g ++给出以下错误:

main.cpp:12:18: error: 
    'virtual void Derived::f(int)' marked 'override', but does not override