多态性

多态性是指具有不同功能的函数可以用同一函数名,这样就可以用一个函数名调用不同内容的函数。

在面向对象方法中一般是这样表述多态性的:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为——每个对象可以用自己的方式去响应共同的消息。

从系统实现的角度看,多态性可分为两类:静态多态与动态多态。

静态多态:在程序编译时系统就能决定调用的是哪个函数,又称为编译时的多态性,通过函数重载实现。

动态多态性:在程序运行过程中才动态地确定操作所针对的对象,又称为运行时多态性,通过虚函数实现。

研究问题是:通过继承而产生相关的不同的派生类,与其类成员同名的成员在不同的派生类中有不同的含义。也就是说,多态性是“一个接口,多种实现”

 

附:

我们定义的类的成员函数中,常常有一些成员函数不改变类的数据成员,也就是说,这些函数是"只读"函数,而有一些函数要修改类数据成员的值。如果把不改变数据成员的函数都加上const关键字进行标识,显然,可提高程序的可读性。其实,它还能提高程序的可靠性,已定义成const的成员函数,一旦企图修改数据成员的值,则编译器按错误处理
非常量成员函数不能被常量对象调用,因为它可能企图修改常量的数据成员。也就是说,常量对象在它的生命周期里不能改变成员变量,它只能调用常量成员函数。

多态可以用同一个调用方式,既能调用派生类又能调用基类的同名函数。在程序中不是通过不同的对象名去调用不同派生层次的同名函数,而是通过指针调用它们。

虚函数就是用来解决这个问题的。虚函数的作用是允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。

 

虚函数使用方法:

  1. 在基类中用virtual声明成员函数为虚函数。这样就可以在派生类中重新定义此函数,为它赋予新的功能,并能方便地被调用。在类外定义虚函数时,不必再加virtual。
  2. 在派生类中定义此函数,要求函数名、函数类型、函数参数与类型全部与基类的虚函数相同,并根据派生类的需要重新定义函数体。C++规定,当一个成员函数被声明为虚函数时,其派生类的同名函数都自动成为虚函数。因此在派生类重新声明该函数时,可以加virtual,也可以不加,但习惯上一般在每一层声明该函数时都加virtual,全程序更清晰。如果在派生类中没有对基类的虚函数重新定义,则派生类简单地继承其直接基类的虚函数。
  3. 定义一个指向基类对象的指针变量,并使它指向一类族中需要调用该函数的对象。
  4. 通过该指针变量调用此虚函数,此时调用的就是指针变量指向的对象的同名函数。

虚析构函数:

当派生类的对象从内存中撤销时一般先调用派生类的析构函数,然后再调用基类的析构函数。但是,如果用new运算符建立了派生类对象,但将该对象的地址赋予基类指针,在程序中用带该指针的delete运算符撤销对象时,会发生一个情况:系统中会执行基类的析构函数,而不执行派生类的析构函数。

 

 

 

如果将基类的析构函数声明为虚函数时,由该基类所派生的所有派生类的析构函数也都自动成为虚函数,即使派生类的析构函数与基类的析构函数名字不相同。

最好把基类的析构函数声明为虚函数,这将使所有派生类的析构函数自动成为虚函数。这样,如果程序中显式地用delete准备删除一个对象,而delete运算符的操作对象用了指向派生类对象的基类指针,则系统会调用相应类的析构函数。

 

纯虚函数

如Point类的成员函数area用来求面积的功能对于点来说就是毫无意义的,它的唯一用途就是让派生类根据自己的需要重新定义。所以可将之设为纯虚函数,声明方式如下:

virtual 函数类型 函数名(参数列表)=0;

注意:

  1.  纯虚函数没有函数体
  2. 最后的“=0”并不表示函数返回值为0,它是告诉编译系统这是“纯虚函数”
  3. 这是声明语句,最后要有分号
  4. 只有声明而无定义,它的功能就是留待派生类中定义
  5. 如果在一个类中声明了纯虚函数,而在其派生类中没有对该函数定义,则该虚函数在派生类中仍为纯虚函数

抽象(基)类

  1. 有的类不是为了定义对象而生,惟一目的是作为基类去建立派生类。
  2. 凡是包含纯虚函数的类都是抽象类:因为纯虚函数不能被调用,包含纯虚函数的类是无法建立对象的。
  3. 派生类对基类所有的纯虚函数重新定义时方可用来定义对象
  4. 抽象类不能定义对象,但是可以定义指向抽象类数据的指针变量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值