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)
为什么这两个输出的结果不同?我认为b
和d
应该指向同一个虚拟表。
答案 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
指令,将考虑int
和float
版本:
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