码迷,mamicode.com
首页 > 其他好文 > 详细

第十六章 多态性

时间:2014-06-28 22:55:22      阅读:276      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   os      

相同函数名具有多态性:

①  译时的多态(由函数名来调用时体现):重载:同类,不同参

②  运行时的多态(用指向不同类的指针来调用):

覆盖:  不同类,同参,基类有virtual(由指针的类型来决定,体现了多态性)

隐藏:①不同类,同参,基类无virtual②不同类,不同参(不论有无virtual)(由指针来决定,不能体现多态性)

1.  为什么要使用多重继承

多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数。C++多态性是通过虚函数(virtual)来实现的。

2.  在派生类中增加函数

RTTI:  ①typeid返回指针或引用所指的实际类型

②dynamic_cast 将基类类型的指针或引用安全的转换成派生类类型的指针或引用

dynamic_cast<son*>pf->beautiful();

注意:①硬性转换尽量少用②必须使用虚函数

3.  使用多重继承

使用多重继承可以避免:①在基类放接口函数②用RTTI将父类的指针转换成派生类的

调用多态性,必须要用虚析构函数

  1. 模拟抽象类

抽象类的作用:

为了实现一个统一的指针,我们可以定义一个类,再由这个类派生出父类和母类

  1. 纯虚函数与抽象类

☆抽象类起到接口的作用,便于父类指针调用子类的对象

virtual viod A()=0;包含一个或者多个纯虚函数的类叫抽象类;

☆纯虚函数只起到接口的作用,要且必须在子类中重新定义

纯虚基类只能申明抽象类的指针,不能开辟抽象类的空间

 

  1. 抽象类实例

 

  1. 复杂的抽象结构

 

  1. 慎用多重继承

在用单一继承可以实现的情况下不要使用多重继承

/** ************重载,重写(覆盖),隐藏的识别*************
重载:如何调用取决于参数
覆盖:如何调用取决于object(有virtual 同名 同参)
隐藏:如何调用取决于pointer
a、编译时多态性:通过重载函数实现 
b、运行时多态性:通过虚函数实现。
包含纯虚函数(virtual void funtion()=0 )的类称为抽象类。由于抽象类包含了没有定义的纯虚函数,所以不能定义抽象类的对象。
小结:1、有virtual才可能发生多态现象
2、不发生多态(无virtual)调用就按原类型调用
*/

#include<iostream>
using namespace std;

class Base
{
public:
    virtual void f(float x)
    {
        cout<<"Base::f(float)"<< x <<endl;
    }
    void g(float x)
    {
        cout<<"Base::g(float)"<< x <<endl;
    }
    void h(float x)
    {
        cout<<"Base::h(float)"<< x <<endl;
    }
private:
    float x;
};
class Derived : public Base
{
public:
    virtual void f(float x)
    {
        cout<<"Derived::f(float)"<< x <<endl;   //多态(覆盖)必须不同类
    }
    void g(int x)
    {
        cout<<"Derived::g(int)"<< x <<endl;     //隐藏(参数不同。此时,不论有无virtual关键字,
                                                //基类的函数将被隐藏(注意别与重载混淆)。)
    }                                            //重载必须要在同一个类中定义
    void h(float x)
    {
        cout<<"Derived::h(float)"<< x <<endl;   //隐藏(参数也相同,但是基类函数没有virtual关键字。
    }                                            //此时,基类的函数被隐藏(注意别与覆盖混淆)。)

};
int main(void)
{
    Derived d;
    Base *pb = &d;
    Derived *pd = &d;
    // Good : behavior depends solely on type of the object
    pb->f(3.14f);   // Derived::f(float) 3.14
    pd->f(3.14f);   // Derived::f(float) 3.14

    // Bad : behavior depends on type of the pointer
    pb->g(3.14f);   // Base::g(float)  3.14
    pd->g(3.14f);   // Derived::g(int) 3 

    // Bad : behavior depends on type of the pointer
    pb->h(3.14f);   // Base::h(float) 3.14
    pd->h(3.14f);   // Derived::h(float) 3.14
    return 0;
}

 

第十六章 多态性,布布扣,bubuko.com

第十六章 多态性

标签:style   blog   color   使用   os      

原文地址:http://www.cnblogs.com/zenseven/p/3794213.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!