版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
c++知识点面向对象c++面对对象重点整理
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.3virtual与其他成员函数
发生动态绑定的两个条件:
1)虚函数
2)基类类型的引用或指针进展函数调用
在任何须要基类的地方都可以用派生类对象去代替,所以指向基类的指向或引用可以指向派生类,因为派生类有全部它须要的成员或成员函数。
对象是非多态的对象类型确定且不变。对象的动态类型是与静态类型一样,这一些与引用或指针相反。运行的函数是由对象的类型定义的。
假如派生类须要调用虚函数的基类版本,那么须要用作用域操作符来覆盖虚函数机制。
不要在基类和派生类中为虚函数定义不同的默认实参,因为实参是静态绑定的,在编译时期确定,所以当你用指向派生类对象的基类类型的指针访问虚函数时,事实上用的是基类成员函数的默认实参。
2.4访问限制与继承
派生列表中运用访问标号用来确定运用派生类的用户和对基类成员访问的权限。
首先,基类中只有public和protected的成员可以被派生类访问。
1)假如派生类是公用继承(publicinheritance)
派生类的成员或友员可以访问基类中的public和protected成员,用户通过派生类可以访问基类中的public成员,基类中的private只有基类的成员可以访问。
classBulk_item:publicItem_base{...};
那么基类中的public与protected就像派生类中的public和protected类型一样。
2)假如派生类是受爱护继承(protectedinheritance)
classBulk_item:protectedItem_base{...};
基类中的public和protected成员就像派生类的中protected一样
3)假如派生类是私有继承(privateinheritance)
classBulk_item:privateItem_base{...};
基类中的public和protected成员就像派生类的中private一样,用户不能通过派生类对象访问基类中的任何成员。
public派生类继承了基类的接口,可以在须要基类的地方运用public派生类。而private和protected派生类那么不行以。
可以用using声明复原基类成员在派生类中的访问级别。
class和struct在定义继承类的,默认的继承类别也不同。
classBase{...};
classD1:Base{...}等价于classD1:privateBase{...}
structD2:Base{...}等价于classD2:publicBase{...}
class与struct用来定义类除了访问级别的不同外,其他没有任何不同。
派生类的成员函数中不能干脆访问基类类型对象的protected成员,但是可以通过派生类对象访问基类的protected成员。
voidBulk_item::memfcn(constBulk_itemd,constItem_baseb)
{
//priceisprotected
doubleret=price;//ok
ret=d.price;//ok
ret=b.price;//error
}
2.5继承与静态成员
假如基类定义了static成员,那么在整个继承层次中只有一个这样的成员。
2.6防止继承的发生
有时候我们会定义这样一种类,我们不盼望其他类继承它,或者不想考虑它是否适合作为一个基类。C++11中允许在类名后加一个关键字final来防止继承。
ClassNoDerivedfinal{/**/}
ClassBad:publicNoDerived{/**/}//error!
3、派生类与基类之间的转换
可以将基类的指针或引用绑定到派生类对象上有一层极为重要的含义:当运用基类的引用(或指针)时,事实上我们并不清晰该引用(或指针)所绑定对象的真实类型。该对象可能是基类的对象,也可能是派生类的对象。
3.1静态类型与动态类型
表达式的静态类型在编译时总是确定的,它是变量声明时的类型或表达式生成的类型;动态类型那么是变量或表达式表示的内存中的对象的类型,动态类型直到运行才可知。假如表达式既不是引用也不是指针,那么它的动态类型恒久与静态类型相同。
3.2派生类转换为基类
引用转换不同于对象转换
1)将派生类对象传递给盼望承受基类引用的函数,事实上传递进去的就是原来的派生类对象,这个对象没有发生任何改变。
2)而假如将派生类对象传递给盼望承受基类对象的函数,事实上是将实参派生类对象中基类局部复制出来,创立了一个临时的基类对象。
3)派生类对象转换为基类对象事实上像是做了裁切操作。
3.3基类转换为派生
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论