程序设计与算法三六周笔记

多态

虚函数

在类的定义中,前面有虚关键字的成员函数就是虚函数。

class base {

         virtual int get();

};

int base :: get(){} // 虚拟关键字只用在类定义里的函数声明中,写函数体时不用

构造函数和静态成员函数不能是虚函数。

多态的表现形式一

  • 派生类的指针可以赋给基类指针。
  • 基通过类指针调用基类派生状语从句:中类的同名虚函数时:
  1. 若该指针指向一个基类的对象,那么被调用的的英文基类的虚函数 ;
  2. 若该指针指向一个派生类的对象,那么被调用的是派生类的虚函数。这种机制就叫做“多态”。
class CBase {
public:
virtual void SomeVirtualFunction() { }
};
class CDerived:public CBase {
public :
virtual void SomeVirtualFunction() { }
};
int main() {
CDerived ODerived;
CBase * p = & ODerived;
p -> SomeVirtualFunction(); //调用哪个虚函数取决于p指向哪种类型的对象,CDerived的 SomeVirtualFunction()
return 0;
}

多态的表现形式二

  • 派生类的对象可以赋给基类引用
  • 通过基类引用调用基类和派生类中的同名虚函数时:
  1. 若该引用引用的是一个基类的对象,那么被调用是基类的虚函数;
  2. 若该引用引用的是一个派生类的对象,那么被调用的是派生类的虚函数。这种机制也叫做“多态”。
class CBase {
public:
    virtual void SomeVirtualFunction() { }
};
class CDerived:public CBase {
public :
    virtual void SomeVirtualFunction() { }
};
int main() {
    CDerived ODerived;
    CBase & r = ODerived;
    r.SomeVirtualFunction(); //调用哪个虚函数取决于r引用哪种类型的对象,调用CDerived的
    return 0;
} 

多态的作用:

在面向对象的程序设计中使用多态,能够增强程序的柯林斯扩充性,即程序需要修改或增加功能的时候,需要改动和增加的代码较少

 

用基类指针数组存放指向各种派生类对象的指针,然后遍历该数组,就能对各个派生类对象做各种操作,是很常用的做法

在非构造函数,非分构函数的成员函数中调用虚函数,是多态!

构造函数和分构函数中调用虚函数:

在构造函数和析构函数中调用虚函数不是多态。编译时即可确定,调用的函数的英文自己的类或基类中定义的函数,不会等到运行时才决定调用自己的还是派生类的函数。

 

虚析构函数:

举例:

 

纯虚函数和抽象类:

 

包含纯虚函数的类叫抽象类:

  • 抽象艺术类艺术只能作为基类来派生新类使用,不能创建抽象类的对象
  • 抽象类的指针和引用可以指向由抽象类派生出来的类的对象
  1. 一个; //错,A是抽象类,不能创建对象
  2. A * pa; //好的,可以定义抽象类的指针和引用
  3. pa = new A; //错误,A是抽象类,不能创建对象

 

在抽象类的成员函数内可以调用纯虚函数,但是在构造函数或析构函数内部不能调用纯虚函数。(因为在构造函数或析构函数内部如果调用纯虚函数,无法实现多态)

如果一个类从抽象类派生而来,那么当且仅当它实现了基类中的所有纯虚函数,它才能成为非抽象类。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值