C++基础(八)

一、类型的决定性

  通过要给指针或引用访问类的成员,编译器只是根据指针或者引用的类型决定是否可以访问该成员,而与此指针或引用的实际目标对象无关。

二、虚函数与多态

  如果将基类中的某个成员函数声明为虚函数(在其返回类型前面加上virtual关键字),那么其子类中的同型函数也是虚函数(无论其是否带有virtual关键字),而且和基类版本形成覆盖关系。

  这时通过一个指向子类对象的基类指针或引用子类对象的基类引用,调用该虚函数,实际执行的是子类中的覆盖版本,而非基类的原始版本,这种现象称为多态。

 三、重载、隐藏、覆盖

  重载必须在同一个作用域中。

  覆盖必须是同型的虚函数。

  如果不是重载也不是覆盖,而且函数名一样,那就一定是隐藏。

四、有效覆盖的前提条件

  1.只有类的非静态成员函数才能被声明为虚函数,全局函数和类的静态成员函数不能被声明为虚函数。

  2.只有在基类中被声明为虚函数的成员函数才能在子类中覆盖。

  3.虚函数在子类中的覆盖版本必须和该函数的基类版本拥有完全相同的签名,即函数名、形参表、常属性严格一致。

  4.如果基类中虚函数的返回类型为基本类型或类类型的对象,那么子类的覆盖版本必须返回相同的类型。

  5.如果基类中的虚函数返回类类型的指针或引用,那么该函数在子类中的覆盖版本可以返回其基类版本返回类型的共有子类的指针或引用-----类型协变。

  6.子类中的覆盖版本不能比基类 版本说明抛出更多的异常。

  7.无论基类中的虚函数位于该类的共有、私有、还是保护部分,该函数在子类中的覆盖版本都可以出现在任何访控区域。

五、多态的条件

  多态性除了需要在子类和基类间形成有效的虚函数覆盖以外,还必须通过指针或引用访问该虚函数。

  当基类的构造函数被子类的构造函数调用时,子类对象尚不能说是子类类型的,只表现出基类类型的外观和行为。这时,调用虚函数只能被绑定到基类版本,没有多态性。

  当基类的析构函数被子类的析构函数调用时,子类对象已不再是子类类型了,它只表现出基类类型的行为和外观。这时,调用虚函数只能被绑定到基类版本,没有多态性。

 六、纯虚函数、抽象类、纯抽象类

  1.形如virtual 返回类型 函数名(形参表)[const] = 0;的虚函数称为纯虚函数。

  2.至少包含一个纯虚函数的类就叫抽象类,抽象类不能实例化为对象。

  3.如果一个抽象类的子类没有覆盖其基类中的全部纯虚函数,那么该子类就也是抽象类。

  4.除了构造、析构和静态成员函数以外的全部成员函数都为纯虚函数的抽象类就叫做纯抽象类,亦称接口类。

七、虚函数表和动态绑定

  1.对于包含虚函数的类,编译器会为该类生成一张虚函数表(一个类一个),存放每个虚函数地址的函数指针数组,简称虚表,每个虚函数对应一个虚函数表的索引号。

  2.当编译器看到通过指针或引用虚函数时,并不急于生成有关函数调用的指令,它会用一段代码去替代该调用语句,这段代码在运行时执行,完成如下操作:

   (1)确定调用者指针或引用的目标对象并从中获取到虚表指针

   (2)根据所调用函数的序号从虚表中提取相应的函数地址

   (3)根据函数地址调用该虚函数

   这个过程因为实在运行时完成的,所以称为动态绑定。

  3.动态绑定对性能的影响

   (1)虚函数表本身会增加内存空间开销

   (2)虚函数调用的时间开销会大于普通函数

   (3)虚函数不能内联

     建议只有在确实需要多态性的场合才是用虚函数,否则尽量避免使用虚函数

八、运行时类型信息(RTTI,run time type information)

  1.动态类型转换(dynamic_cast)

   动态类型转换应用在具有多态继承关系的父子类的指针或引用之间。在运行期间检查转换源的目标对象的类型与转换目的类型是否一致,

   如果一致,则返回实际的对象指针或引用,否则返回空指针或抛出异常。

  2.typeid运算符

   在运行期间动态获取对象的类型信息

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

  

 

转载于:https://www.cnblogs.com/csqtech/p/7147938.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值