多态(1.多态定义,虚函数,纯虚函数,抽象类)【重点】

1.多态定义

多态:多态是指不同的子类在继承父类后分别都重写覆盖了父类的方法,即父类同一个方法,在继承的子类中表现出不同的形式。比如,你和你朋友同时继承了人这个类中打人的方法,但是你用拳头打人和你朋友用巴掌打人的方法都是打人方法,却表现出不同的形式,这就是现实生活中多态的理解。

2.多态的应用

具体的应用就是通过基类指针来调用派生类里面的虚函数,从而实现这些虚函数各自不一样功能;

3.虚函数

格式:virtual 返回类型 函数名(参数){…}
注意:所有基类的派生类的虚函数必须函数名相同,函数类型相同,参数类型相同,参数个数相同,参数顺序相同

4.实现多态应用的要求和前提

1.设置虚函数,且所有的虚函数(基类里的和派生类里的)函数类型和名字必须一致
2.所有派生类的继承方式采用公有继承
3.设置基类类型的指针,将派生类对象的地址赋给该指针,然后再将指针指向虚函数,就可以调用该派生类里的虚函数,实现该派生类里虚函数的作用

5.示例代码

派生类B,C都继承了基类A里的虚函数who()(打人的方法),但在各自的派生类中实现形式不同(用拳头打人和用巴掌打人…),在通过基类的的指针即可调用不同功能的虚函数

#include<iostream>
using namespace std;
class A
{
private:
    char x;
public:
    A(char xx):x(xx){};
    virtual void  who(){cout<<"it's performance A class"<<endl;}
};
class B:public A
{
private:
    char y;
public:
    B(char xx,char yy):A(xx){y=yy;}
    virtual void who(){cout<<"it's performance B class"<<endl;}
};
class C:public A
{
private:
    char z;
public:
    C(char xx,char zz):A(xx){z=zz;}
    virtual void who(){cout<<"it's performance C class"<<endl;}
};
int main()
{
    A a('A');
    B b('T','O');
    C c('N','D');
    A *p;
    p=&a;p->who();
    p=&b;p->who();
    p=&c;p->who();
    return 0;
}

演示结果:
在这里插入图片描述

6.虚函数和基类指针的注意事项

1.派生类的继承方式必须是公有继承
2.必须首先在基类中定义虚函数
3.基类中虚函数头部前加上关键字virtual后,其派生类中的虚函数头部前可以不加关键字virtual(建议加上)
4.一般通过基类指针访问虚函数时才能体现多态性
5.一个虚函数无论被继承多少次,都可以保持其虚函数的特性
6.虚函数必须是其所在类的成员函数或是析构函数,不能是友元函数,不能是静态函数,不能是构造函数,也不能是内联成员函数

7.虚函数例题

在这里插入图片描述
演讲前先抓阄(输入一个字符),抓到s则妹妹发言,抓到b则哥哥发言,用虚函数和多态来实现

#include<iostream>
using namespace std;
class Li//李氏家族做基类
{
public:
    virtual void say() {};
};
class Li_brother : public Li
{
public:
    virtual void say()
    {
          cout<<"I'm Li ming(哥哥), I have three sports: boxing, fencing and wrestling."<<endl;
    }
};
class Li_sister : public Li{
public:
      virtual void say() 
      { 
          cout<<"I'm Li xia(妹妹), I have two sports: swim and skating."<<endl; 
      }
};
void Speak(Li *pL) { pL->say(); }
int main(){
    Li *p;            //基类指针,李家代表
    Li_brother b;
    Li_sister s;
    char select;                cin>>select;
    if(select =='s')  p = &s;   //基类指针指向派生类Li_sister对象,妹妹获得发言机会
    if(select =='b')  p = &b;   //基类指针指向派生类Li_brother对象,哥哥获得发言机会
    Speak(p);
    return 0;
}

演示结果:
在这里插入图片描述

在这里插入图片描述

8.纯虚函数

在许多情况下,基类中不能对虚函数给出有意义的实现(有意义的函数体),这是要么写成空的函数体(例如例题里基类Li里的虚函数say()),要么写成虚函数,它的实现留给基类的派生类去做,这就是虚函数的作用;

格式:virtual 返回类型 函数名(参数)=0;

9.抽象类

定义:具有纯虚函数的类称为抽象类

注意:抽象类不允许有对象,但可以有指针(抽象类类型的指针)和引用

10.纯虚函数例题

题目:利用纯虚函数计算圆的面积,三角形的面积,长方形或正方形的面积

#include<iostream>
using namespace std;
class figure
{
  protected :
      double x,y;
  public:
      void set_dim(double i, double j=0) { x = i ;  y = j ; }
      virtual void show_area() = 0 ;//纯虚函数
};
class triangle : public figure//三角形
{
public :
      void show_area()
       { cout<<"Triangle with high "<<x<<" and base "<<y <<" has an area of "<<x*0.5*y<<"\n"; }
};
class square : public figure//长方形或正方形
{
 public:
      void show_area()
       { cout<<"Square with dimension "<<x<<"*"<<y <<" has an area of "<<x*y<<"\n"; }
};
class circle : public figure//圆
{
 public:
    void show_area()
    { cout<<"Circle with radius "<<x; cout<<" has an area of "<<3.14*x*x<<"\n";    }
};
int main()
{
   figure *p;	// 声明抽象类指针
   triangle t;   square s;   circle c;
   p=&t;
   p->set_dim(10.0,5.0); 	// 计算三角形面积
   p->show_area();
   p=&s;
   p->set_dim(10.0,5.0);	// 计算长方形或正方形面积
   p->show_area();
   p=&c;
   p->set_dim(9.0);		// 计算圆形的面积
   p->show_area();
   return 0;
}

演示结果:
在这里插入图片描述

11.纯虚函数注意

1.纯虚函数只在基类中,所以抽象类都是基类
2.具有多态操作能力的有:基类指针指向派生类对象,抽象类类型的指针,抽象类类型的引用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值