21xrx.com
2024-12-22 22:45:02 Sunday
登录
文章检索 我的文章 写文章
C++名字隐藏技巧
2023-07-05 05:15:45 深夜i     --     --
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++中应用广泛,特别是在多态性的实现中更是必不可少。掌握好这个技巧,可以让我们更加灵活地设计和继承类,并避免出现一些隐藏的问题。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复