C++中override和overwrite的探究

#include <iostream>

class Parent
{
public:
  void F() // 子类中有相同签名的函数时,称为重写(overwrite),
  // 没有virtual关键字
  {
    std::cout << "Parent.F()" << std::endl;
  }
  virtual void G() // 带virtual关键字且子类中存在相同函数时,称为覆盖(override)
  {
    std::cout << "Parent.G()" << std::endl;
  }
  void H()
  {
    std::cout << "Parent.HHH()" << std::endl;
  }
  virtual void M()
  {
    std::cout << "Parent.M()" << std::endl;
  }
};

class ChildOne : public Parent
{
public:
  // 子类重写(overwrite)父类函数
  void F()
  {
    std::cout << "ChildOne.F()" << std::endl;
  }
  // 子类覆盖父类虚函数,主要实现多态(virtual, override可以省略)
  void G()
  {
    std::cout << "ChildOne.G()" << std::endl;
  }
  
  void H(int x) // 只要函数名相同,无论函数签名是否一致,父类的方法都将被隐藏
  {
    std::cout << "ChildOne.H(int)" << std::endl;
  }

  virtual void M()
  {
    std::cout << "ChildOne.M()" << std::endl;
  }

  void M(int x)
  {
    std::cout << "ChildOne.M(int x)" << std::endl;
  }
};

int main()
{
  ChildOne childOne; // = new ChildOne();
  Parent *p = (Parent *)&childOne;
  
  p->F(); // Parent.F()
  p->G(); // 多态, ChildOne.G()
  p->H();
  //childOne.H(); // error: no matching function for call to ‘ChildOne::H()’
  //note: candidate: ‘void ChildOne::H(int)’
  //note:   candidate expects 1 argument, 0 provided
  childOne.H(2); // fine
  //childOne.M(); // error: no matching function for call to ‘ChildOne::M()’, note: candidate: ‘void ChildOne::M(int)’
  childOne.M(3); // fine
  p->M(); // 说明子类中有因不同函数签名而发生的overwrite现象时,子类中与父类相同签名的函数仍然可以override【即多态不受影响】
  //p->M(2); // error: no matching function for call to ‘Parent::M(int)’
  //总结:子类函数的virtual关键字可以省略,因此子类函数中无需考虑virtual的存在
  //只要子类中出现了与父类中同名但是不同函数签名的函数,子类都将覆盖父类的对应函数(即父类的该函数被隐藏),且无论父类中该函数是否有virtual关键字

  return 0;
}

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值