C++的那些事:面向对象

发表于:2014-7-07 09:38

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:☆Ronny丶    来源:51Testing软件测试网采编

  1 OOP概述
  面向对象基于三个基本概念:数据抽象、继承和动态绑定。通过使用数据抽象,我们可以将类的接口与实现分离;使用继承,可以定义相似的类型并对其相似关系建模;使用动态绑定,可以在一定程度上忽略相似类型的区别,而以统一的方式使用它们的对象。
  1.1 继承
  继承是派生类与基类之间的关系,它们共享了一些公共的东西,而派生类特化了一些本质不同的东西。类与类之间的继承关系构成了继承层次。在C++中,基类必须指定希望派生类重定义哪些函数,定义为virtual的函数是基类期待派生类重新定义的,需要在派生类中继承的不能定义为虚函数。
  派生类重新定义的虚函数前面可以加virtual,但这不是必要的,在C++11中,允许派生类显式地注明它将使用哪个成员函数改写基类虚函数,只用在该函数形式参数列表后增加一个override关键字。
  1.2 动态绑定
  当函数接口定义了基类的引用(或指针)时,在函数内调用虚函数时,发生动态绑定。因为这时候函数实参可以为基类类型也可以为派生类类型,虚函数只有在运行阶段才能确定需要调用哪个定义。
  2 定义基类与派生类
  2.1 定义基类
  基类成员函数中希望在派生类中重新定义的函数前面加了virtual,这类函数在调用时,在程序运行阶段确定。任何构造函数之外的非静态函数都可以是虚函数。virtual关键字只需要在基类定义的时候加在需要重定义的函数前面,实现的时候不需要。
  基类通常都应该定义一个虚析构函数,即使该函数不执行任何实际操作也是如此。
  派生类可以继承定义在基类中的成员,但是派生类的成员函数不能访问从基类继承而来的private成员,只能访问public和protected成员。而用户则只能通过派生类访问从基类继承而来的public成员。
  pubic:用户可访问的类成员,继承类也可以访问它们。
  private:类的成员和友元可以访问,继承类不能访问。
  protected:用户不能访问,但是可以被类的成员或派生类的成员访问。
  2.2 定义派生类
  1)派生类的成员变量分两种:一是从基类继承到的成员变量,另一种是显示自己特殊化的变量或者为特殊化接口而准备的变量。
  2)一般来说派生类都要重新定义基类中声明的虚函数,但如果没有重新定义,则延用基类里的定义。
  3)派生类中的虚函数定义与基类应该完全一致,如果基类返回基类类型的引用,派生类则返回派生类类型的引用。
  4)派生类中定义虚函数时,可以不保留virtual。
  5)作为基类的类必须是已经定义的,不能仅仅是声明,因为它的成员将被用到,所以一个类不能从自身派生出一个类。
  2.3 virtual与其他成员函数
  发生动态绑定的两个条件:
  1)虚函数
  2)基类类型的引用或指针进行函数调用
  在任何需要基类的地方都可以用派生类对象去代替,所以指向基类的指向或引用可以指向派生类,因为派生类有所有它需要的成员或成员函数。
  对象是非多态的——对象类型已知且不变。对象的动态类型是与静态类型相同,这一些与引用或指针相反。运行的函数是由对象的类型定义的。
  如果派生类需要调用虚函数的基类版本,则需要用作用域操作符来覆盖虚函数机制。
  不要在基类和派生类中为虚函数定义不同的默认实参,因为实参是静态绑定的,在编译时期确定,所以当你用指向派生类对象的基类类型的指针访问虚函数时,实际上用的是基类成员函数的默认实参。
  2.4 访问控制与继承
  派生列表中使用访问标号用来决定使用派生类的用户和对基类成员访问的权限。
  首先,基类中只有public和protected的成员可以被派生类访问。
  1) 如果派生类是公用继承(public inheritance)
  派生类的成员或友员可以访问基类中的public和protected成员,用户通过派生类可以访问基类中的public成员,基类中的private只有基类的成员可以访问。
  class Bulk_item:public Item_base{...};
  那么基类中的public与protected就像派生类中的public和protected类型一样。
31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号