具有多重继承的重载函数
在 C 中,函数重载允许在单个作用域内定义多个具有相同名称的函数,前提是他们有不同的参数列表。但是,此行为不会扩展到具有相同名称但不同签名的多个继承函数。这就提出了一个问题:为什么此类函数不被视为重载?
根据 C 标准第 10.2/2 节,成员查找规则规定在名称查找期间不考虑隐藏声明。当多个基类定义名称相同但参数不同的函数时,这些函数可能会相互隐藏。因此,如果生成的声明集不是来自同一类型的子对象,或者包含非静态成员和来自不同子对象的成员,则会出现歧义,并且程序被视为格式错误。
例如:
class A { public: int f(int); }; class B { public: int f(); }; class C : public A, public B {};
在这种情况下,f 是不明确的,因为它是在两个不同的基类(A 和 B)中定义的。因此,以下从 C 类对 f 的调用是不正确的:
int main() { C c; c.f(); // ambiguous }
要解决这种歧义,您可以使用 using 声明来指定哪个基类实现 f 函数。例如:
class C : public A, public B { using A::f; using B::f; };
通过此修改,c.f() 现在从 A 类显式调用 f,解决了歧义。
相反,您提供的第二个代码示例可以工作,因为定义了 foo(float)在 Derived 类的范围内,并且不是从多个基类继承的。因此,d.foo(5)直接调用foo(float)函数,没有任何歧义。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3