21xrx.com
2025-04-04 03:28:00 Friday
文章检索 我的文章 写文章
C++名字隐藏技巧
2023-07-05 05:15:45 深夜i     16     0
C++ 名字隐藏 技巧

在C++中,有时候会出现函数重载的情况,也就是在同一个作用域中,存在多个同名函数的情况。为了解决这种问题,C++使用了名字隐藏技巧。

名字隐藏指的是在派生类作用域中,如果派生类中的函数和基类中的函数同名,那么基类的同名函数会被隐藏起来,无法直接访问。而通过使用作用域限定符,可以访问被隐藏起来的函数。

举个例子:

class Base {
public:
  void f(int i) { cout << "Base::f(int i)" << endl; }
  void f(double d) { cout << "Base::f(double d)" << endl; }
};
class Derived : public Base {
public:
  using Base::f;
  void f(char c) { cout << "Derived::f(char c)" << endl; }
};
int main() {
  Derived obj;
  obj.f(1); // 调用 Base::f(int)
  obj.f(1.0); // 调用 Base::f(double)
  obj.f('a'); // 调用 Derived::f(char)
  return 0;
}

在派生类`Derived`中,通过`using Base::f;`语句,将基类中的`f`函数暴露出来。当调用`f`函数时,如果参数类型和数量与基类中的某个`f`函数相同,就会调用基类中的同名函数。而如果参数类型和数量与派生类中的`f`函数相同,就会调用派生类中的同名函数。

需要注意的是,名字隐藏只在派生类作用域内生效,如果在其他作用域中访问基类的同名函数,仍然可以正常访问。如下所示:

void f(int i) { cout << "global f(int i)" << endl; }
int main() {
  Derived obj;
  obj.f(1); // 调用 Base::f(int)
  f(1); // 调用 global f(int)
  return 0;
}

在上面的示例中,即使在`main`函数中定义了一个同名的全局函数`f`,也不会影响对基类中的同名函数的访问。

名字隐藏技巧在C++中应用广泛,特别是在多态性的实现中更是必不可少。掌握好这个技巧,可以让我们更加灵活地设计和继承类,并避免出现一些隐藏的问题。

  
  

评论区

    相似文章