【C++】虚函数

一、什么是虚函数

在类的成员函数前加上virtual关键字,这个函数就是虚函数。

虚函数的所用就是完成多态。多态示例如下:

cpp 复制代码
class A
{
	
public:
	virtual void func()//虚函数
	{
		cout << "A" << endl;
	}
	void ftwo()//普通函数
	{
		cout << "FA" << endl;
	}
private:
	int val=1;
};

class B :public A
{
public:
	void func()
	{
		cout << "B" << endl;
	}
	void Ftwo()
	{
		cout << "FB" << endl;
	}
private:
	int sum = 1;
};

int main()
{
	B b;
	A* pa =&b;//父类指针指向子类对象
	pa->ftwo();
	pa->func();
}

运行结果如下:

可以看到:父类指针调用函数,若该函数是虚函数,则调用子类的同名函数(无同名调用虚函数)。

如果不是虚函数,则正常调用父类的普通函数。

二、静态绑定与动态绑定

将一个名称与内存地址关联起来,就是绑定。

静态绑定:在编译时就完成函数的绑定(非虚函数)。

动态绑定:在运行时才完成函数的绑定(虚函数)。

虚函数要执行哪个版本在运行时才知道,所以是动态绑定。

三、虚函数的使用

3.1使用条件

1、使用环境必须是继承,在父类的成员函数前加virtual

2、一定是指针或引用调用

3.2注意事项

1、虚函数必须有定义

2、构造函数不能是虚函数

3、函数被声明为虚函数后,所有子类该函数都是虚函数

3.3在子类中的使用

1、想使用虚函数完成多态,子类必须重写父类的虚函数

(重写/覆盖:返回值、函数名、参数列表、const属性必须与父类的虚函数相同。vritual可不加,但建议加上。参数的缺省值一定要相同,不然会有糟糕的后果)

2、当父类返回类型是父类指针/引用时,子类返回值可以为子类指针/引用

cpp 复制代码
class A
{
	
public:
	virtual A* func()//返回类型为父类指针
	{
		cout << "A" << endl;
	}
private:
	int val=1;
};
class B :public A
{
public:
	virtual B* func()//返回类型为子类指针
	{
		cout << "B" << endl;
	}
private:
	int sum = 1;
};

int main()
{
	B b;
	A* pa =&b;
	pa->func();
}

3.4final和override说明符

1、final:在虚函数括号后面加,表示该函数无法被重写

2.override:在重写的函数括号后面加,检查重写是否正确(不加这个,重写写错检查不出来)

四、虚函数表、虚函数表指针

4.1虚表指针

编译器储存虚函数的方法是:给对象添加一个隐藏指针,该隐藏指针指向一个函数数组,这个数组被称为虚函数表,该隐藏指针被称为虚表指针(虚函数表指针),该指针存在类对象的最前面。

以下代码中,类里没有成员变量,但有隐藏的虚表指针,所以大小是8。

4.2虚函数表

父类定义虚函数后,父类对象会将虚函数的地址放到虚函数表中,自身存放一个虚表指针。

子类对象会独立的生成一个与父类相同的虚函数表,如果子类重写了父类的虚函数,那么在子类的虚函数表中会将父类的虚函数地址覆盖为自己的虚函数地址。

相关推荐
倒头就睡的小比特2 天前
算法竞赛C++常用的STL
c++·算法
weilx12342 天前
C++笔记-文件IO-<fcntl.h>
c++
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
伞伞悦读2 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
Smileyqp沛沛2 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车2 天前
C/C++ 为什么需要编译器?
开发语言·c++
旖旎夜光2 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
吞下星星的少年·-·2 天前
C++ 萌新语法入门篇
c++·算法比赛
霍霍的袁2 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
another heaven2 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法