C++ 多态性

来源:互联网 发布:鲁邦三世知乎 编辑:程序博客网 时间:2024/05/16 04:25
    利用多态性,一个函数可以根据调用它的对象的不同的不同类型可以产生不同的行为。
  
     派生类的一个重要思想:派生类的对象可以被当做它的基类对象的处理。

     一旦一个函数被声明为virtual ,那么从整个继承层次的那一点起向下的所有类中,它将保持是virtual的。即使当派生类重写此函数是没有显式的声明。

     如果函数通过指向派生类对象的基类指针调用virtual函数,程序会根据所指向对象的类型而不是指针类型,动态(即执行时)选择正确的派生类函数。

     当virtual函数通过按名引用特定对象和使用圆点成员选择运算符的方式被调用时,调用哪个函数在编译时就已经决定(静态绑定),所调用的函数正是为特定对象所属的类定义的函数。因此,用virtual函数进行动态绑定只能通过指针(或引用)句柄完成。

    基类指针和派生类指针指向基类对象和派生类对象的四种方式:
  1:基类指针指向基类对象。
  2:派生类指针指向派生对象。
  3:基类指针指向派生类对象:这是一种安全的方式,因为一个派生类对象也是一个基类对象。然而,这一指针只能调用基类的成员函数。
  4:派生类指针指向基类对象:这种方式会产生编译错误。

   把基类对象当做派生类对象会导致错误。

   通过声明一个或多个virtual虚函数为纯虚函数,可以使一个类成为抽象类。一个pure virtual function 是在声明时“初始化值为0”的函数。

    未能在派生类中重写纯virtual函数,然后试图实例化这个派生类对象,将会产生编译错误。


    重写(覆盖)是指派生类函数覆盖基类函数,特征是:
     1:不同的范围,分别位于基类和派生类中   
     2:函数的名字相同    
     3:参数相同   
     4:基类函数必须有virtual关键字

    重定义(隐藏是指派生类的函数屏蔽了与其同名的基类函数,规则如下:  
   1:如果派生类的函数和基类的函数的同名,但是参数不同,此时不管有无virtual,基类的函数被隐藏。    
   2:如果派生类的函数与基类的函数同名,并且参数也相同,但是基类的函数没有virtual,此时基类的函数被隐藏。

    c++编译器为了支持运行时的多态性而在编译时创建的数据结构。
    多态性是通过三级指针(即“三级间接取值”)实现的。
    当c++编译含有一个或多个virtual函数的类时,他为这个类创建一个virtual函数表。每次调用该类的函数时,运行程序都会利用virtual函数表选择正确的函数实现。
     第一级指针----即virtual函数表中的函数指针。当调用virtual时,这些指针指向实际执行的函数。
     第二级指针----无论何时实例化具有一个或多个virtual函数的类的对象时,编译器给这个对象附上一个指针,指向对象所属类的virtual函数表。这个指针通常放在对象的前部,但不做特别要求。
     第三级指针仅仅接收virtual函数调用的对象句柄。这个级别中的句柄也可以是引用。


    如果要删除一个具有virtual析构函数的派生类对象,却显式的通过指向该对像的一个基类指针,对它应用delete运算符,那么c++标准会指出这一行为为定义。解决方法为在基类中创建virtual析构函数。这样,即使所有派生类的析构函数不与基类的析构函数同名,也可以使这些析构函数为virtual函数。

    当一个派生类对象被销毁时,派生类中属于基类的部分也会被销毁。基类的析构函数在派生类的析构函数执行后自动执行。


原创粉丝点击