又犯了老错误... 自责一下

     项目里头存在一个ownerString,派生自std::basic_string<Char>,并且修改和扩展了一些东东。其中重写了basic_string<Char>的replace()方法。

     在一个代码片段中使用ownerString::replace方法,居然编译提示错误,找不到函数原型,当时是看到basic_stirng中存在对应replace函数的,咋回事?

     晕了半天,后来才发现时因为ownerString中重写了其中的2个replace重载函数,而我用的那个原型的函数在ownerString中没有被重写,导致提示我编译错误。

     两个问题:

1、又忘了函数覆盖。深深的自责中,函数的重载、重写、覆盖....

2、不知道当初写这个ownerString代码的人为啥只重写其中的部分函数内容,汗一个。

 

为了防止以后再出现类型的错误,总结一下关键点

1、重载只能在类名字空间范围内存在。换句话说,重载不能发生在父类和子类中。父类写了一个函数fn(),然后在子类写了一个和fn同名不同参数的函数,这两个fn不会构成重载,而是覆盖。只要子类中出现有和父类同名的函数,子类中的此函数将覆盖父类中的同名函数。

2、上面说的问题存在一个虚函数的问题。我们知道虚函数是被重写(override)的。那上面说法不是有问题了?比如:

parent::fn()  child::fn()这两个是虚函数,那么子类fn是重写父类的fn函数。其实和1点说的不冲突。按照1中所说的,child类中定义了fn函数,而parent类也有fn函数,那么在child类中,是看不到parent::fn()函数的,这个是对的。因为你可以这么想: parent有两个fn重载虚函数,virtual parent::fn()  virtual  parent::fn(int),但是在child中,你重写了其中一个virtual  child::fn()。这样的话,子类的fn会隐藏父类的两个fn()函数。对于child类来说,你只能调用fn(),而不能调用fn(int)。 至于你用指向child类对象的parent类指针,那么是可以访问fn(int)的。这个和你强制类型转换为父类的引用调用parent类的函数一样:

    child c;

   ((parent &)c).fn(1)  ---- OK

 

3、对于虚函数重写来说,真正调用的函数取决于指针指向的对象的类型;对于隐藏来说,真正调用的指针类型;重载只能存在于同一类名字空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值