21xrx.com
2024-12-22 20:10:36 Sunday
登录
文章检索 我的文章 写文章
C++中的函数重写、重载和覆盖:详解
2023-07-10 21:21:03 深夜i     --     --
C++ 函数重写 重载 覆盖 详解

在C++中,函数是编程中最基本的概念之一。C++支持函数的重写、重载和覆盖的概念,让编程更加灵活高效。下面来详细解释一下这三个概念的区别和用途。

1. 函数重写(Override)

重写指的是子类中有一个与基类中函数名和参数表都相同的函数,它将基类中的函数重新定义了。当程序调用该函数时,子类的函数将覆盖父类的函数,执行子类中的函数体。重写的函数与被重写的函数必须有相同的返回值类型,如果是引用类型,则返回值的类型和引用的类型也必须相同。例如:


class A{

public:

  virtual void print()

    cout << "A" << endl;

  

};

class B: public A{

public:

  void print() override

    cout << "B" << endl;

  

};

int main(){

  A* p = new B();

  p->print();

  return 0;

}

结果为:


B

2. 函数重载(Overload)

重载指的是在同一个作用域下一个函数名可以声明多次,函数名相同但是参数列表不同,即参数个数、类型或顺序不同。在调用重载函数时,编译器根据函数名和参数列表的不同来确定具体要调用的函数。例如:


void print(int x)

  cout << x << endl;

void print(float x)

  cout << x << endl;

int main(){

  print(1);

  print(1.1f);

  return 0;

}

结果为:


1

1.1

3. 函数覆盖(Hide)

覆盖指的是函数隐藏,即子类中有一个与基类同名的函数,但参数列表不同。如果子类中的函数和基类中的函数同名又有不同参数,父类的函数就被隐藏了,子类的函数无法调用父类中重载的函数。例如:


class A{

public:

  void print(int x)

    cout << "A " << x << endl;

  

};

class B: public A{

public:

  void print(float x)

    cout << "B " << x << endl;

  

};

int main(){

  B b;

  b.print(1);

  b.print(1.1);

  //b.print(1.1f); 这里调用不了,因为父类中没有float类型的print函数

  return 0;

}

结果为:


B 1

B 1.1

综上所述,重写是在不同的类之间进行的函数覆盖,重载是在同一类中,使用不同参数列表的同名函数进行操作,覆盖是子类定义在基类方法中的相同名称函数,参数类型不同。在程序编写中,可以根据实际需求来选择合适的函数调用方式,提高程序的效率和可读性。

  
  

评论区

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