C++第五次作业

虚函数

虚函数是面向对象编程函数的一种特定形态,是C++用于实现多态的一种有效机制。

1、什么是虚函数?
指向基类的指针在操作它的多态类对象时,会根据不同的类对象调用其相应的函数,这个函数就是虚函数,虚函数用virtual修饰函数名。虚函数的作用是在程序的运行阶段动态地选择合适的成员函数。在派生类中重新定义的函数应与虚函数具有相同的形参个数和形参类型,(参数类型的顺序也要一致),以实现统一的接口。如果在派生类中没有重新定义虚函数,则它继承基类的虚函数。

使用虚函数时需要注意一下几个方面:
(1)只需在声明函数的类体中使用关键字virtual将函数声明为虚函数,在定义函数时不需要
(2)将基类中某一成员函数声明为虚函数后,派生类中的同名函数自动成为虚函数
(3)如果类(基类和派生类)中声明了某成员函数为虚函数,则类中不能再出现与之相同的非虚函数
(4)非类的成员函数不能定义为虚函数,全局函数以及类的静态成员函数(因为调用类的静态成员函数不需要实例,但调用虚函数需要一个实例)和构造函数(因为构造函数是在对象完全构造之前运行的,构造函数是初始化虚表指针,而当要调用虚函数时需要知道虚表指针,存在矛盾,但构造函数里是可以调用虚函数的)、内联函数也不能定义为虚函数,但一般将析构函数定义为虚函数(如果不把析构函数定义为虚函数,当用基类指针delete时,无法调用派生类的析构函数,派生类部分无法析构)
(5)指针声明不调用构造函数

编译器发现一个类中有虚函数时,会立即为此类生成一个虚函数表,虚函数表的各表项为指向对应虚函数的指针。编译器还会在此类中隐含插入一个指针vptr指向虚函数表。另外在调用类的构造函数时,指向基础类的指针此时已经变成指向具体类的this指针,这样依靠this就可以得到正确的table,这样才能真正与函数体进行连接,这就是动态联编,实现多态的基本原理。

例8-4

#include"pch.h"
#include<iostream>
using namespace std;
class Base1 {
public:
	 void display()
	{
		cout << "父类的display正在被调用!" << endl;
	}
};
class Base2 :public Base1 {
public:
	void display()
	{
		cout << "子类的display正在被调用!" << endl;
	}
};
class Derived :public Base2 {
public:
	void display()
	{
		cout << "继承的display正在被调用!" << endl;
	}
};
void fun(Base1 * ptr)
{
	ptr->display();
}

int main()
{
	
	Base2 a;
	Derived b;
	fun(&a);
	fun(&b);
	
	return 0;
}

在上面的父类声明了一个display函数,然后用另外两个类来继承。在写一个指针函数参数为指向基类对象的指针,来调用类里面的方法display()。根据C++类里面,当继承类和父类里面出现同名函数的时候,继承的会覆盖掉父类的方法,只调用继承类里面的同名方法,因此我预测可能会是调用自身的函数。
运行截图
在这里插入图片描述
结果全是调用的父类的函数。原来是函数指针的参数是指向基类对象的指针,和基类共享地址等于说就是调用的基类里面的函数。
那么我们在基类display()声明的时候前面加上virtual,把他声明为一个虚函数。
在这里插入图片描述
运行结果:
在这里插入图片描述
通过这个实验,展示了虚函数的功能。

纯虚函数

在这里插入图片描述
运行:
在这里插入图片描述
带有纯虚函数的类是抽象类,如果派生类的给出所有纯虚函数的函数实现,这个派生类就可以定义自己的对象,因此不再是抽象类,反之,如果派生类没有给出全部纯虚函数的实现,这时的派生类仍然是一个抽象类。抽象类不能实例化。

posted on 2019-10-26 14:49  那我先走了  阅读(96)  评论(0编辑  收藏  举报

导航