为什么下面的表达式 'd.f(1);' 在 main() 中没有歧义?
Why there's no ambiguity in the expression `d.f(1);` below in main()?
为什么Base::f(int)
和Derived::f(int)
之间的main()
中下面的表达式d.f(1);
没有歧义?
class Base
{
public:
void f(int i) {}
void f(int i, int j) {}
};
class Derived : public Base
{
public:
using Base::f;
void f(int i) {}
};
int main()
{
Derived d;
d.f(1);
}
正如其他人所写,由于Derived::f(int)
隐藏了Base::f(int)
,因此不存在歧义。您可能期望只有在没有using
声明的情况下才会出现这种情况:
using Base::f;
但隐藏仍然适用。C++11标准第7.3.3/15段规定:
当using声明将基类的名称带入派生类作用域时,成员函数和派生类中的成员函数模板覆盖和/或隐藏成员函数和成员函数具有相同名称的模板、参数类型列表(8.3.5)、cv限定符和ref限定符(如果有)基类(而不是冲突的)。
它还提供了一个与您的示例非常相似的示例(请查看表达式p->f(1)
如何不会导致歧义,而是选择D::f
):
struct B {
virtual void f(int);
virtual void f(char);
void g(int);
void h(int);
};
struct D : B {
using B::f;
void f(int); // OK: D::f(int) overrides B::f(int);
using B::g;
void g(char); // OK
using B::h;
void h(int); // OK: D::h(int) hides B::h(int)
};
void k(D* p)
{
p->f(1); // calls D::f(int)
p->f(’a’); // calls B::f(char)
p->g(1); // calls B::g(int)
p->g(’a’); // calls D::g(char)
}
派生类中的函数隐藏基类中的函数
这叫做阴影。
因为d
的静态类型是Derived
,而Derived::f(int)
隐藏Base::f(int)
。
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 代码在main()中运行,但在函数中出现错误
- 构造对象的歧义
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 函数是否可以访问传递给main()的参数
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 我的 int main() 中出现堆栈溢出错误
- C++变量名(可以将 main 声明为变量,但对于其他函数名称则不然)
- 当我尝试在 Main 中调用插入函数时,它不是取数字?
- File.cpp.o:OpenPose 标志 CMakeFiles/.. 的多重定义/main.cpp.o:首先在这里定
- 为什么类和 main() 函数中也有动态内存分配
- 在 main.cpp 的上下文中找不到目录(带有 CMake 的快板)
- 我想在 Main 中用 C++ 调用其他类中的一个类,但我做不到
- 数组初始值设定项的构造函数歧义
- "main"函数堆栈中的对象在第一个任务运行时被覆盖 (FreeRTOS)
- 为什么 'main' 函数中的局部 int 变量会自动初始化?
- 为什么下面的表达式 'd.f(1);' 在 main() 中没有歧义?