C/C++笔记 -- C++ 多态

1、函数的重载
      函数重载依据参数列表的不同来区分,而与返回值无关。全局函数和类成员函数同名同参不算重载,其作用域不一样。
2、成员函数的重载(overload),覆盖(overrid)和隐藏
       成员函数的重载是:具有相同的作用域,函数名字相同,参数类型(包括const或非const),顺序或数目不同,virtual关键字忽略。
      覆盖是指派生类重新定义了基类的成员函数,其特征是:作用域,函数名,参数都相同,且基类函数必须是虚函数。
     隐藏是一种派生类的同名函数不能重新实现基类的同名函数的现象(与多态覆盖相反),隐藏会体现在如下:
     a.派生类的同名函数与参数列表与基类不一样,不管基类的函数是否virtual都将被隐藏。
     b.派生类与基类的同名函数的参数列表也一样,但基类函数不是virtual类型的。
    摆脱隐藏的两种办法:
    1、针对a.,把隐藏的函数变为“重载”,子类中使用using Base:fun来显示声明,类似声明了一个同名,同参的一个子类函数。
    2、针对b,把在子类的同名同参函数中显示的调用传递,Base::fun.

3、异常处理
      异常处理机制是一种运行时通知机制。异常抛出点与异常扑点一般距离很远,异常抛出点可能在底层软件模块内,而异常捕获点
     在高层主件中。抛出的异常对象可以是任何类型。catch子句像带一个参数的函数,而throw相当于函数的调用语句,不过catch子句处理完了后,不会回到throw而是继续catch后的语句继续执行。异常未被捕获,throw到顶层后会被调用unexpected()函数而终止(terminate())通过调用set_unexpected来重设终止功能函数。
    所有从try到throw之间构造起来的局部对象的析构函数将按以构造函数相反的顺序自动析构。
    由于构造函数和析构函数没有返回值,所以对于需要捕获构造或析构出错信息,最合适的方式就是抛出异常。
    catch块的参数应当采用引用传递而不是值传递、一定把派生类的异常匹配放到基类前,否则容易出现被过早处理掉了。
     可以在catch块中抛出一个与当前异常类型不同的异常对象(常用于异常说明与实际抛出的异常不符的时候)。
     异常说明是用来修饰可能抛出异常的函数的,用来限制该函数所抛出异常的种类。
     void g()throw(); //不抛出异常;
     void f()//可能抛出异常;
     void k()throw T1,T2//可能抛出2种异常
     异常说明的好处除了限制函数抛出的异常种类,更为客户代码(调用者)提供捕获异常的说明。
4,RTTI
        虚函数可以动态的根据指针或引用指向的对象来执行对应派生类的函数,但对于派生类新括的函数(基类没有的),无法通过基类的指针或引用来显示的调用。typid()返回描述当前对象类型信息type_info。type_info支持/重载了==,!=运算符括了name()函数。调用typeid的开销和
      调用虚函数是一样的,但调用dynamic_cast<dest_type>运算符需要遍历一颗继承树。static_cast<dest_type>的区别在于static_cast<dest_type>只是做编译时类型强制转换。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值