派生类继承中的函数名称冲突
考虑以下代码片段:
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 中的函数同名的函数时,派生类函数会隐藏基类函数。
名称查找范围
类作用域中的名称查找遵循以下步骤:
解决方案
要解决函数名称冲突,您可以在派生类的作用域中重新声明基类函数。这确保了这两个函数在派生类及其后代中都是可见的:
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。”
以上是如何解决C派生类继承中的函数名称冲突?的详细内容。更多信息请关注PHP中文网其他相关文章!