多个同名继承函数:为什么不重载?
在 C 中,当多个类继承同名但签名不同的函数时,编译器将这些函数视为不同的成员而不是重载函数。这会导致从派生类调用函数时出现歧义。
请考虑以下示例:
struct Base1 { void foo(int); }; struct Base2 { void foo(float); }; struct Derived : public Base1, public Base2 { };
这里,Base1 和 Base2 都定义了一个名为 foo 且具有不同参数的函数。当从派生类 Derived 调用 d.foo(5) 时,编译器会引发“模糊调用”错误。
与要求函数签名相同的覆盖不同,重载允许具有相同名称的函数,但不同的参数。但是,此规则不适用于多个继承函数。
根据 C 成员查找规则,当派生类中存在多个相同成员名称的声明时,来自不同基类的声明将被视为不明确。当声明并非全部来自同一类型的子对象,或者存在来自不同子对象的非静态成员时,就会发生这种情况。
要解决这种歧义,您可以使用 using 声明来显式指定应调用哪个基类的函数:
struct Derived : public Base1, public Base2 { using Base1::foo; using Base2::foo; }; int main() { Derived d; d.foo(5); // Calls Base1::foo(int) d.foo(5.0f); // Calls Base2::foo(float) }
在第二个代码片段中,您提供:
struct Base { void foo(int); }; struct Derived : public Base { void foo(float); };
Derived 中的函数 foo(float) 覆盖了基类中的 foo(int) 函数。因此,当调用 d.foo(5) 时,foo(float) 函数被正确调用,没有任何歧义。
以上是为什么 C 中同名的多个继承函数不重载?的详细内容。更多信息请关注PHP中文网其他相关文章!