0714学习总结(多态性,typeid)

来源:互联网 发布:局域网打印机端口 编辑:程序博客网 时间:2024/06/14 20:08
1.C++多态性
C++多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为遮蔽或者称为重写。


2.最常见的用法就是声明基类的指针,利用该指针指向任意一个派生类对象,调用相应的虚函数,可以根据指向的派生类的不同而实现不同的方法。如果没有使用虚函数的话,即没有利用C++多态性,
  则利用基类指针调用相应的函数的时候,将总被限制在基类函数本身,而无法调用到派生类中被重写过的函数。因为没有多态性,函数调用的地址将是一定的,而固定的地址将始终调用到同一个函数,
  这就无法实现一个接口,多种方法的目的了。


3.虚函数对于多态具有决定性的作用,有虚函数才能构成多态。
1.只需要在虚函数的声明处加上 virtual 关键字,函数定义处可以加也可以不加。
2.为了方便,你可以只将基类中的函数声明为虚函数,这样所有派生类中具有遮蔽(覆盖)
 关系的同名函数都将自动成为虚函数。
3.当在基类中定义了虚函数时,如果派生类没有定义新的函数来遮蔽此函数,
 那么将使用基类的虚函数。
4.只有派生类的虚函数遮蔽基类的虚函数(函数原型相同)才能构成多态(通过基类指针访问派生类函数)。
5.造函数不能是虚函数。对于基类的构造函数,它仅仅是在派生类构造函数中被调用,这种机制不同于继承。
 也就是说,派生类不继承基类的构造函数,将构造函数声明为虚函数没有什么意义。
6.析构函数可以声明为虚函数,而且有时候必须要声明为虚函数。

4.构成多态的条件
1.必须存在继承关系
2.继承关系中必须有同名的虚函数,并且它们是遮蔽(覆盖)关系。
3.存在基类的指针,通过该指针调用虚函数。

5.什么时候声明虚函数
1.首先看成员函数所在的类是否会作为基类。
2.然后看成员函数在类的继承后有无可能被更改功能,如果希望更改其功能的,一般应该将它声明为虚函数。
 如果成员函数在类被继承后功能不需修改,或派生类用不到该函数,则不要把它声明为虚函数。
 
6.在C++中,可以将虚函数声明为纯虚函数,语法格式为:
virtual 返回值类型 函数名 (函数参数) = 0;
  纯虚函数没有函数体,只有函数声明,在虚函数声明的结尾加上=0,表明此函数为纯虚函数。
  最后的=0并不表示函数返回值为0,它只起形式上的作用,告诉编译系统“这是纯虚函数”。
  
  包含纯虚函数的类称为抽象类(Abstract Class)。之所以说它抽象,是因为它无法实例化,也就是无法创建对象。原因很明显,纯虚函数没有函数体,不是完整的函数,无法调用,也无法为其分配内存空间。


  抽象类通常是作为基类,让派生类去实现纯虚函数。派生类必须实现纯虚函数才能被实例化。


7.在实际开发中,你可以定义一个抽象基类,只完成部分功能,未完成的功能交给派生类去实现(谁派生谁实现)。
   这部分未完成的功能,往往是基类不需要的,或者在基类中无法实现的。虽然抽象基类没有完成,但是却强制要求派生类完成,这就是抽象基类的“霸王条款”
   
8.(1)一个纯虚函数就可以使类成为抽象基类,但是抽象基类中除了包含纯虚函数外,还可以包含其它的成员函数(虚函数或普通函数)和成员变量。
  (2)只有类中的虚函数才能被声明为纯虚函数,普通成员函数和顶层函数均不能声明为纯虚函数。
  
9.typeid 运算符用来获取一个表达式的类型信息。类型信息对于编程语言非常重要,它描述了数据的各种属性
(1)对于基本类型(int、float 等C++内置类型)的数据,类型信息所包含的内容比较简单,主要是指数据的类型。
(2)对于类类型的数据(也就是对象),类型信息是指对象所属的类、所包含的成员、所在的继承关系等。

typeid 的操作对象既可以是表达式,也可以是数据类型,下面是它的两种使用方法:
typeid( dataType )
typeid( expression )


10.这种在程序运行后确定对象的类型信息的机制称为运行时类型识别(Run-Time Type Identification,RTTI)。
   在 C++ 中,只有类中包含了虚函数时才会启用 RTTI 机制,其他所有情况都可以在编译阶段确定类型信息。
   
11.多态(Polymorphism)是面向对象编程的一个重要特征,它极大地增加了程序的灵活性,C++、C#、Java 等“正统的”面向对象编程语言都支持多态。
   但是支持多态的代价也是很大的,有些信息在编译阶段无法确定下来,必须提前做好充足的准备,让程序运行后再执行一段代码获取,这会消耗更多的内存和 CPU 资源。




原创粉丝点击