虚函数和多态性

来源:互联网 发布:asp无组件上传源码 编辑:程序博客网 时间:2024/05/19 18:39

动态绑定和静态绑定

虚函数

  • 定义格式:
virtual <类型> <成员函数名>(<参数列表>{    //函数体}
  • 虚函数的作用:可以通过基类的指针或者对象引用来访问基类和派生类中被声明为虚函数的同名函数。(如果基类中的成员和派生类中的成员存在同名的情况,c++的编译系统将采取同名覆盖原则来处理因为同名而存在的冲突问题。因此,必须用到虚函数。
  • 虚函数具有一个重要的特点就是继承性。在基类中声明的虚函数,那么在派生类中声明完全相同的函数(函数类型、函数名和函数参数)也为虚函数。声明该虚函数是可以使用virtual关键字,也可以不使用。因为当将基类中的某一成员函数声明为虚函数后,派生类中的同名函数自动成为虚函数。但是建议还是加上virtual关键字,提高程序的可读性。

抽象基类和纯虚函数

抽象类

  • 抽象类也是一种特殊的类,该类不能用来定义对象,这种类存在的作用只有一个,就是被继承。
  • 如果一个类中包含一个或多个纯虚函数,就称该类为抽象类。而且,抽象类必须作为基类才有意义,抽象类又可以称为抽象基类
class <类名>{<访问权限>:    virtual <返回类型> <函数名>(<参数列表>)=0;    //其它纯虚函数...};
  • 抽象类的作用:抽象类可以为多个派生类提供一个公共的接口,反映这些类之间的关系。
  • 尽管抽象类不能定义对象(即不可实例化),但是可以定义指向抽象类的对象指针,当使用其派生类定义相应对象后,就可以使用该指针指向派生类的对象。通过该指针调用相应的虚函数,实现多态性的操作。

虚析构函数

  • 通常将基类的析构函数定义为虚函数,这样其派生类的析构函数也将被自动定义为虚函数。实际应用的时候,系统将采用动态绑定的机制调用相应的析构函数,是析构过程更加彻底。
  • 只有当一个类作为基类时,才有必要将其析构函数定义为虚函数。

类成员指针

  • 将一个函数指针指向一个类的成员函数是非法的

数据成员指针

  • 指针访问的同时需要结合类对象才能访问到数据成员
  • 声明格式:
<变量类型> <类名> ::*<指针名称>;

例如:

double Transport::* pd;//用typedef创建一个同义词typedef double Transport::* pdouble;
  • pdouble 并不是指向某个数据项的,因为它不是类对象的数据成员指针,而是类成员指针。数据成员指针严格意义上来说并不能算作是指针,因为数据成员指针在类中表示的只是一个偏移量,这个偏移量表示的是该数据成员相对于具体对象的起始地址的距离。在使用该指针时必须和对象结合使用。

成员函数指针

  • 定义成员函数指针时需要使用类名进行修饰,这就表明这种指针只能用于类中,不能用来存储其它一般函数的地址。
    声明格式,举例:
typedef void(Transport::*pfunc)();      //声明成员函数指针
0 0
原创粉丝点击