C++ 的重载(overload),重写(override), 重定义(redefining/hide)

本文详细解析了 C++ 中的函数重载、重写与重定义的概念及区别,通过具体示例帮助读者更好地理解这些概念,并强调了在实际编程中正确使用它们的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、重载(overload)
实现重载要求函数名相同,但是参数表列 个数顺序类型不同。注意 不能通过返回类型来重载。
(1)相同的范围(在同一个作用域中) ;
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无。

(5)返回值可以不同;


二、重写(也称覆盖 override)
指在派生类中重新定义基类的虚函数,特征是:
(1)不在同一个作用域(分别位于派生类与基类) ;
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有 virtual 关键字,不能有 static 。
(5)返回值相同(或是协变),否则报错;<—-协变这个概念我也是第一次才知道…

(6)重写函数的访问修饰符可以不同。尽管 virtual 是 private 的,派生类中重写改写为 public,protected 也是可以的


三、重定义(也成隐藏)
(1)不在同一个作用域(分别位于派生类与基类) ;
(2)函数名字相同;
(3)返回值可以不同;
(4)参数不同。此时,不论有无 virtual 关键字,基类的函数将被隐藏(注意别与重载以及覆盖混淆) 。
(5)参数相同,但是基类函数没有 virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆) 。


下面通过一个demo 来加深理解:

#include<iostream>

class A {
public:
  void Func1(int a) {
      std::cout << "class A: Func1" << std::endl;
  }

  virtual void Func2(int a) {
      std::cout << "class A: Func2" << std::endl;
  }

  virtual void Func3(int a) {
      std::cout << "class A: Func3" << std::endl;
  }
};

class B : public A {
public:
  // redefining
  void Func1(int a) {
      std::cout << "class B: Func1" << std::endl;
  }

  // override
  void Func2(int a) {
    std::cout << "class B: Func2-1" << std::endl;
  }

  // overload
  void Func2(int a, int b) {
    std::cout << "class B: Func2-2" << std::endl;
  }

  // redefining
  void Func3(char a) {
    std::cout << "class B: Func3" << std::endl;
  }
};

int main(int argc, char* argv[])
{
  B* b = new B;
  b->Func1(1);
  b->Func2(1);   //verify override
  b->Func2(1, 1); // verify overload
  b->Func3(1);  //verify redifining with different params

  std::cout<<"Point A"<<std::endl;
  A* a = new B;
  a->Func1(1);
  a->Func2(1);
  //a->Func2(1, 1);
  a->Func3('x');  
  return 0;
}




参考:

http://glgjing.github.io/blog/2014/12/27/c-plus-plus-zhong-zai-,-zhong-xie-,-zhong-ding-yi-qu-bie/

http://www.cnblogs.com/tanky_woo/archive/2012/02/08/2343203.html

http://blog.youkuaiyun.com/yiya1989/article/details/17230867








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值