【发布时间】:2011-05-08 08:34:43
【问题描述】:
考虑:
#include <iostream>
using namespace std;
struct A {
virtual void f() { cout << "A::f" << endl; }
virtual void f() const { cout << "A::f const" << endl; }
};
struct B : public A {};
struct C : public A {
virtual void f() { cout << "C::f" << endl; }
};
int main()
{
const B b;
b.f(); // prints "A::f const"
const C c;
c.f();
// Compile-time error: passing ‘const C’ as ‘this’ argument of
// ‘virtual void C::f()’ discards qualifiers
}
(我正在使用 GCC。)
所以 f() 的 const 版本似乎隐藏在 C 中。这对我来说很有意义,但它是标准规定的吗?
【问题讨论】:
-
“虚拟”是一条红鲱鱼。我们在这里没有虚拟地(通过基类指针或引用)调用任何
f。f的所有查找都找到派生最多的f。 -
Virtual 和 const 并不真正适用于该问题,但我将它们保留为标签,因为我没有看到太大的危害并且不需要包含更相关的标签。
-
我同意
virtual,但const是整个问题的意义所在。覆盖f()隐藏f() const。
标签: c++ inheritance virtual constants name-lookup