C++ 多态

匿名 (未验证) 提交于 2019-12-03 00:37:01

1.1 定义

1.2 规则

2 虚函数

2.1 定义

虚函数是一种在基类定义为virtual的函数,并在一个或多个派生类中重新定义的函数。

2.2 格式

class 类名{     vitrual 函数声明 };

2.3 规则

  • 在基类中用virtual声明成员函数为虚函数。类外实现虚函数时,不必再加virtual;
  • 在派生类中重新定义此函数称为覆写,要求函数名,返回类型,函数参数个数及类型全部匹配。并根据派生类的需要重新定义函数体;
  • 当一个成员函数被声明为虚函数后,其派生类中完全相同的函数(显示的写出)也为虚函数。可以在其前面加上vitrual以示清晰;
  • 定义一个基类对象的指针,并使其指向子类的对象,通过该指针调用虚函数,此时调用的就是指针变量指向对象的同名函数;
  • 子类中覆写的函数,可以为任意访问类型,依子类需求决定;
  • 只有类中的成员函数才能声明为虚函数,因为虚函数仅适用于与有继承关系的类对象,所以普通函数(包括友元函数)不能说明为虚函数;
  • 静态成员函数不能是虚函数,因为静态成员函数不受限于某个对象;
  • 内联函数不能是虚函数,因为内联函数不能再运行中动态确定位置;
  • 构造函数不能是虚函数,析构函数可以是虚函数,而且通常声明为虚函数;

3 纯虚函数

3.1 格式

class 类名{     vitrual 函数声明=0; };

3.2 规则

  • 含有纯虚函数的类,称为抽象基类,不可实例化。即不能创建对象,存在的意义就是被继承,提供族类的公共接口,java中称为interface。
  • 纯虚函数只有声明,没有实现,被“初始化”为0。
  • 如果一个类中声明了纯虚函数,而在派生类中没有对该函数定义,则该虚函数在派生类中仍然为纯虚函数,派生类仍然为纯虚基类。

4 多态

多态可以分为静多态和动多态,如下图所示。


4.1 静多态

函数重载就是一个典型的静多态。

(1)函数名相同;(2)参数的个数不同、参数的类型不同、参数的顺序不同,均可构成重载;(3)返回类型不同不可以构成重载;(4)相同的范围(在同一个类中)。

4.2 动多态

覆盖。覆盖是指派生类中重新定义父类中的函数,其函数名、参数列表、返回类型必须同父类中的相对应被覆盖的函数严格一致,只有函数体不同。

覆盖的规则:(1)函数名相同;(2)参数相同;(3)基类函数必须有virtual关键字;

上面已经提及重载和覆盖,接着说一下隐藏:隐藏是指派生类的函数屏蔽了与其同名的基类函数。

规则:(1)如果派生类的函数与基类的函数同名,但是参数不同,此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆);(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆);





文章来源: C++ 多态
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!