具有相同签名的多个继承函数不重载
在面向对象编程中,继承允许类从父类继承属性和方法。然而,当多个继承类具有相同名称但不同签名的函数时,就会出现一个常见问题。
问题
考虑以下代码片段:
#include <iostream> struct Base1 { void foo(int); }; struct Base2 { void foo(float); }; struct Derived : public Base1, public Base2 { }; int main() { Derived d; d.foo(5); // Ambiguous call to "foo" std::cin.get(); return 0; }
此代码产生“对 foo 的模糊调用”错误,表明对 foo 的调用无法解析,因为存在多个继承的具有相同名称但不同签名的函数。
说明
根据 C 成员查找规则,当一个类继承自多个基类且有多个声明时相同的名称,任何隐藏的声明都将被消除。如果生成的声明集来自不同类型或包含来自不同基类的非静态成员,则会出现歧义。
在上面的示例中,Base1 和 Base2 都定义了 foo 函数,但它们具有不同的签名。当 Derived 继承自 Base1 和 Base2 时,对于不同类型的 foo 有两个不同的声明。这会导致歧义,从而导致编译错误。
解决方案
要解决歧义,您可以使用 using 声明来指定要使用哪个基类的 foo 版本。例如:
class Derived : public Base1, public Base2 { using Base1::foo; };
此 using 声明可确保在 Derived 中使用 Base1 中的 foo 函数。
问题
请注意,在您提供的第二个代码片段,派生类只有一个 foo 函数(带有 float 参数)。这是因为 Base1 中的 foo 函数被 Derived 中的 foo 函数隐藏了。因此,d.foo(5) 使用来自 Derived 的 float 参数调用 foo 函数,而不是 Base1。
因此,回答标题中的问题,多个具有相同名称但不同签名的继承函数不成立被视为重载函数,因为它会导致歧义。相反,编译器需要使用 using 声明或其他技术进行显式解析来指定应使用哪个函数。
以上是在 C 中如何解析具有相同名称但不同签名的多个继承函数?的详细内容。更多信息请关注PHP中文网其他相关文章!