我正在阅读Stroustrup的C++ 0x FAQ,并坚持使用这段代码.请考虑以下代码
struct A
{
void f(double)
{
std::cout << "in double" << std::endl;
}
};
struct B : A
{
void f(int)
{
std::cout << "in int" << std::endl;
}
};
int main()
{
A a; a.f(10.10); // as expected, A.f will get called
B b; b.f(10.10); // This calls b.f and we lose the .10 here
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的理解是,当一个类型被继承时,所有受保护的和公共成员都可以从派生类访问.但根据这个例子,看起来我错了.我期待bf会调用基类f.我通过改变派生类得到了预期的结果
struct B : A
{
using A::f;
void f(int)
{
std::cout << "in int" << std::endl;
}
};
Run Code Online (Sandbox Code Playgroud)
问题
因为A :: f是"隐藏"而不是"重载"或"被覆盖".参考:
http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.9
第一个代码的工作方式与 C++ 的设计工作方式相同。
重载解析遵循一组非常复杂的规则。来自 Stroustrup 的 c++ 圣经 15.2.2 “不同基类的函数之间的歧义不能根据参数类型来解决。”
他接着解释了您所描述的“使用”的用法。
这是该语言的设计决策。
我倾向于遵循 Stroustrup 的书而不是标准,但我确信它就在那里。
[编辑]
这是(来自标准):
第13章
当在同一范围内为单个名称指定两个或多个不同的声明时,该名称被称为重载。
进而:
13.2 声明匹配
1 如果两个同名函数声明位于同一作用域并且具有等效参数声明,则它们指的是同一个函数 (13.1)。派生类的函数成员与基类中的同名函数成员不在同一作用域中。
| 归档时间: |
|
| 查看次数: |
653 次 |
| 最近记录: |