首页 > 后端开发 > C++ > 如何解决C派生类继承中的函数名称冲突?

如何解决C派生类继承中的函数名称冲突?

Patricia Arquette
发布: 2024-12-30 13:40:16
原创
626 人浏览过

How to Resolve Function Name Collision in C   Derived Class Inheritance?

派生类继承中的函数名称冲突

考虑以下代码片段:

class A { public: void foo(string s) {} };
class B : public A { public: int foo(int i) {} };
class C : public B { public: void bar() { string s; foo(s); } };
登录后复制

编译此代码时,编译器生成以下内容错误:

error: no matching function for call to 'C::foo(std::string&)'
candidates are: int B::foo(int)
登录后复制

此错误是由于函数名称遮蔽而发生的。当派生类 B 定义了与其基类 A 中的函数同名的函数时,派生类函数会隐藏基类函数。

名称查找范围

类作用域中的名称查找遵循以下步骤:

  1. 考虑类及其基类中名称的所有声明类。
  2. 消除基类中其他声明隐藏的任何声明。

解决方案

要解决函数名称冲突,您可以在派生类的作用域中重新声明基类函数。这确保了这两个函数在派生类及其后代中都是可见的:

class A { public: void foo(string s) {} };
class B : public A { public: int foo(int i) {}; using A::foo; };
class C : public B { public: void bar() { string s; foo(s); } };
登录后复制

通过添加 using A::foo;,您指定基类 A 中的 foo 函数在派生类中也可用B 类。现在,代码将正确编译。

附加注释

  • 标准定义类作用域中的名称查找如下:
“以下步骤定义类作用域中名称查找的结果,C.首先,考虑该类及其每个基类子对象中名称的每个声明,一个子对象中的成员名称 f 隐藏了子对象中的成员名称 f。如果 A 是 B 的基类子对象,则为 A。”
  • 名称查找发生在访问控制之前。因此,即使B中的foo函数是私有的,A中的foo函数仍然找不到。

以上是如何解决C派生类继承中的函数名称冲突?的详细内容。更多信息请关注PHP中文网其他相关文章!

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