首页 > 后端开发 > C++ > 为什么 C 中同名的多个继承函数不重载?

为什么 C 中同名的多个继承函数不重载?

Patricia Arquette
发布: 2024-12-21 16:17:09
原创
604 人浏览过

Why Don't Multiple Inherited Functions with the Same Name Overload in C  ?

多个同名继承函数:为什么不重载?

在 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板