返回

精通C++函数重载,隐藏与覆盖重写,让代码更加优雅

后端

在C++编程语言中,函数重载、隐藏与覆盖重写是三个重要的概念,它们允许程序员以不同的方式使用相同的函数名称,从而提高代码的灵活性和可重用性。

函数重载

函数重载是指在同一个作用域内定义多个具有相同名称但参数列表不同的函数。当调用重载函数时,编译器会根据实参的类型和数量来确定调用哪个函数。

例如,以下代码演示了函数重载:

#include <iostream>

using namespace std;

int sum(int a, int b) {
  return a + b;
}

double sum(double a, double b) {
  return a + b;
}

int main() {
  cout << sum(1, 2) << endl;  // 输出:3
  cout << sum(1.5, 2.5) << endl;  // 输出:4
  return 0;
}

在这个例子中,我们定义了两个具有相同名称sum的函数,但它们的函数签名不同。第一个函数接受两个整型参数并返回一个整型值,而第二个函数接受两个浮点型参数并返回一个浮点型值。当我们调用sum函数时,编译器会根据实参的类型来确定调用哪个函数。

函数隐藏

函数隐藏是指在派生类中定义一个与基类具有相同名称和相同函数签名的函数。当派生类的对象调用这个函数时,派生类中的函数将被调用,而基类中的函数将被隐藏。

例如,以下代码演示了函数隐藏:

#include <iostream>

using namespace std;

class Base {
public:
  void print() {
    cout << "Base class print function" << endl;
  }
};

class Derived : public Base {
public:
  void print() {
    cout << "Derived class print function" << endl;
  }
};

int main() {
  Base base;
  base.print();  // 输出:Base class print function

  Derived derived;
  derived.print();  // 输出:Derived class print function
  return 0;
}

在这个例子中,Base类和Derived类都定义了一个名为print的函数。当我们调用Base类的print函数时,Base类中的print函数将被调用。当我们调用Derived类的print函数时,Derived类中的print函数将被调用,而Base类中的print函数将被隐藏。

函数覆盖重写

函数覆盖重写是指在派生类中定义一个与基类具有相同名称和相同函数签名的函数,但函数体不同。当派生类的对象调用这个函数时,派生类中的函数将被调用,而基类中的函数将被覆盖。

例如,以下代码演示了函数覆盖重写:

#include <iostream>

using namespace std;

class Base {
public:
  virtual void print() {
    cout << "Base class print function" << endl;
  }
};

class Derived : public Base {
public:
  void print() override {
    cout << "Derived class print function" << endl;
  }
};

int main() {
  Base base;
  base.print();  // 输出:Base class print function

  Derived derived;
  derived.print();  // 输出:Derived class print function
  return 0;
}

在这个例子中,Base类和Derived类都定义了一个名为print的函数。Base类中的print函数被声明为virtual函数,这允许Derived类覆盖这个函数。当我们调用Derived类的print函数时,Derived类中的print函数将被调用,而Base类中的print函数将被覆盖。

结论

函数重载、隐藏与覆盖重写是C++编程语言中三个重要的概念,它们允许程序员以不同的方式使用相同的函数名称,从而提高代码的灵活性和可重用性。

函数重载允许程序员为具有不同参数类型的函数使用相同的名称。函数隐藏允许派生类中的函数隐藏基类中的具有相同名称的函数。函数覆盖重写允许派生类中的函数覆盖基类中的具有相同名称的函数。

理解和掌握这三个概念对于编写高质量的C++代码非常重要。