65,210
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
struct A{
virtual void f()
{
puts("A");
}
};
struct B: A{
void f()
{
puts("B");
}
};
struct C:B{
using A::f;
};
int main(int argc, char* argv[])
{
C c;
c.f(); //输出B
c.C::f(); //输出A
}
不是这样,这个例子的特殊就在于把vitrual去掉后,程序会输出不同的结果。
由此是否可以推断出,直接通过对象调用函数 f , 执行的结果应与 f 是否是虚函数无关?
那么可以推断出前面所举的例子,是C++标准中的一个Bug,即
10.3.2: The rules for member lookup (10.2) are used to determine the final overrider for a virtual function in the scope of a
derived class but ignoring names introduced by using-declarations.
这个规则是错误,应该去掉。
struct A{
virtual void f()
{
puts("A");
}
};
struct B: A{
private: void f()
{
puts("B");
}
};
struct C:B{
using A::f;
};
int main(int argc, char* argv[])
{
C c;
c.f();
}
c.C::f(); //输出A
这里没用到它的动态类型。 只是::改变了name lookup的范围, 我不认为这也算多态。