C++技术——多态、抽象类

一 多态相关知识点
1. 用基类的指针 或引用操纵多个类型 的能力被称为多态,继承, 得到派生类的指针或引用给父类, 父类有虚拟函数。


2.实现过程是: 用基类的指针类指向派生类的地址,在调用虚函数(因为调用虚函数是通
 过查虚表执行函数的,但虚表中的虚函数指针可以在继承的时候被子类覆盖)。


3.在多态中会出现父类指针指向子类,那么父类指针用完后会 delete,那么这时候默认会调
用父类的虚构函数,如果子类中有内存要释放,那就被泄露掉了,为了解决这问题就把基
类的析构函数设置为虚函数。

4 .如果虚函数在基类与派生类中出现,仅仅是名字相同,而形式参数不同,或者是返回类型不同,那么即使加上了virtual关键字,也是不会进行滞后联编的。 

5. 只有类的成员函数才能说明为虚函数,因为虚函数仅适合用与有继承关系的类对象,所以普通函数不能说明为虚函数。 

6. 静态成员函数不能是虚函数,因为静态成员函数的特点是不受限制于某个对象。 

7. 内联(inline)函数不能是虚函数,因为内联函数不能在运行中动态确定位置。即使虚函数在类的内部定义定义,但是在编译的时候系统仍然将它看做是非内联的。 

8. 构造函数不能是虚函数,因为构造的时候,对象还是一片位定型的空间,只有构造完成后,对象才是具体类的实例。 

9. 析构函数可以是虚函数,而且通常声名为虚函数。
 

二 抽象类

1. 纯虚函数并不需要实现,如果一个类中的有纯虚函数那么这个类就是抽象类
什么情况下使用纯虚函数:
在基类本身生成对象是不合情理的时候,
比如:动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常
理。为了解决这个问题,方便使用类的多态性,引入了纯虚函数的概念,将函数定义为纯
虚函数(方法:virtual 函数返回类型 函数名()= 0;),则编译器要求在派生类中必须予以
重写以实现多态性。同时含有纯虚拟函数的类称为抽象类,它不能生成对象。

2. 应用场景:项目负责人一般可以创建一个抽象类,每个功能函数都声明为纯虚函数,接下程序员根据这个抽象类重写每个

纯虚函数,这样项目负责人和项目小组成员可以很好形成沟通。

三  知识扩充:概念的区别:即重载重写(覆盖),以及重定义(同名隐藏)

1.重载是指在同一作用域中允许有多个同名函数,而这些函数的参数列表不同,包括参数个数不同,类型不同,次序不同,需要注意的是返回值相同与否并不影响是否重载。
2.重写(覆盖)重定义(同名隐藏)则有点像,区别就是在写重写的函数是否是虚函数,只有重写了虚函数的才能算作是体现了C++多态性,否则即为重定义,在之前的代码中,我们看到子类继承了基类的fun()函数,若是子类没有fun函数,依旧会调用基类的fun函数,若是子类已重定义,则调用自己的fun函数,这就叫做同名隐藏,当然此时如果还想调用基类的fun函数,只需在调用fun函数前加基类和作用域限定符即可。

3. 用表图表示关系:

猜你喜欢

转载自blog.csdn.net/wghkemo123/article/details/82746211