C++多态知识点(虚函数、纯虚函数)

前言:派生类可以继承基类的成员函数,都是无法重载基类的成员函数!
当派生类中存在和基类相同的成员函数时,基类的成员函数就会被覆盖!

当派生类存在与基类相同的成员函数,我们称之为函数重定义,也就是在派生类中重新定义基类中具有相同名称的成员函数。

1、多态的使用
根据类型兼容性原则,基类指针可以直接指向派生类对象,看下面的例子:

#include
using namespace std;
class A
{
public:
	A()
	{
		cout<<"A"<<endl;
	}
	void print()
	{
		cout<<"print A"<<endl;
	}
};
class B:public A
{
public:
	B()
	{
		cout<<"B"<<endl;
	}
	void print()
	{
		cout<<"print B"<<endl;
	}
};

void func(A *p)
{
	p->print();
}

int main()
{
	A a;
	B b;
	A *pa=new A;
	B *pb=new B;
	pa->print();
	pa=pb;
	pb->print();
	
最后输出的两个结果是一样的,为什么?
通过基类指针只能访问派生类的成员变量,不能访问派生类的成员函数!!!

而我们的目的是:当基类指针指向基类对象时,就调用基类的成员函数,当基类指针指向派生类对象时,就调用派生类重定义函数

为了实现这个目的,C++产生了虚函数,只需要在基类成员函数声明前面加上关键字virtual,用virtual修饰的成员函数叫做虚函数。

2、多态——虚函数!

来看下面的代码:
C++多态知识点(虚函数、纯虚函数)_第1张图片
C++多态知识点(虚函数、纯虚函数)_第2张图片在这里插入图片描述C++多态知识点(虚函数、纯虚函数)_第3张图片
3、虚函数详解
虚函数对于多态而言具有决定性的作用,有虚函数才能实现多态。

注意事项:
1)只需要在基类的成员函数声明前面加virtual关键字,将基类中的函数声明为虚函数
2)在基类中定义虚函数时,如果派生类没有定义新的函数来重写这个函数,那么将使用基类的虚函数
3)只有用派生类的虚函数重写基类的虚函数才能构成多态
4)构造函数不能是虚函数,(派生类不能继承基类的构造函数)
5)析构函数可以声明为虚函数

什么时候声明虚函数呢?
1)首先看成员函数所在的类是否会作为基类
2)成员函数在类的继承后是不是要更改功能,需要更改功能,那就是虚函数。

4、虚析构函数
构造函数的调用规则:自上往下的依次调用基类的构造函数,最后调用自己的构造函数完成初始化

析构函数的调用规则:首先调用自己的析构函数,从下往上的调用基类的析构函数。

想要通过基类指针来释放派生类的对象是存在问题的,派生类对象的资源并不能全部被释放。

为了解决这个问题,我们需要将基类的析构函数设为虚函数,这样它的派生类的析构函数都会变成虚函数。在调用delete时,因为析构函数是虚函数,会根据传入的具体对象来调用对象自己的析构函数。从而达到释放全部对象资源。

C++多态知识点(虚函数、纯虚函数)_第4张图片
C++多态知识点(虚函数、纯虚函数)_第5张图片
5、纯虚函数和抽象类
在C++中,可以将虚函数声明为纯虚函数
语法格式:virtual 返回值类型 函数名(函数参数)=0;

纯虚函数没有函数体,只有函数声明,在虚函数声明结尾加上“=0”,表明是纯虚函数。

包含纯虚函数的类称为抽象类,因为它无法实例化一个对象

抽象类通常作为基类,让派生类去实现纯虚函数,派生类必须实现纯虚函数才能实例化

纯虚函数常用于“依赖倒置原则”
1)妈妈讲故事
2)组装电脑

你可能感兴趣的:(C++)