C++:虚函数的使用方法,作用,解决什么问题

1: 为什么要引入虚函数

问题:如果要解决同一族类不同对象,对同一函数调用作出不同的响应?我们应该怎么处理。

答案:我们知道引入虚函数可以解决这个问题,但同时重写也可以解决这个问题,但为什么要引入虚函数这个概念了,请看下面例子。

看下下面案例

#include<iostream>
#include<string>
using namespace std;
class Base {
public:
	 void func() {
		cout << "Base func 调用了" << endl;
	}
};

class Son :public Base {
public:	
	void func() {
		cout << "son func 调用了" << endl;
	}
};

int main() {
	Son s;
	Base *base;
	base = &s;
	s.func();
	(*base).func();
	return 0;
}

 ​​​​​

 

根据运行结果可知:

显然 base.func() 函数调用不符合我们的预期,因为 base = s ; base对象已经指向了 s对象,理论上应调用 son 类的成员函数 func() ,但是结果并没有。这个就是重写的劣势,所以我们需要引起 虚函数:虚函数就是为了保证 :同一类族中不同类的对象,对同一函数调用作出不同的响应。这个就是动态多态性问题。

2:虚函数定义 

当把基类的某个成员函数声明为虚函数后,允许在其派生类中对该函数重新定义,赋予它新的功能,并且可以通过指向基类的指针指向同一类族中不同类的对象,从而调用其中的同名函数。

就是解决: 动态多态性问题,同一类族中不同类的对象,对同一函数调用作出不同的响应。

语法特点:

1:基类中声明的虚函数,派生类在重新定义此函数的时候,可以为它赋予新的功能,并能方便的被调用,而且在类外定义的时候,不必在加 virtual 关键字。

2:C++ 规定 当一个成员函数被声明虚函数后,那么其派生类的同名函数都可以直接成为虚函数。但是如果派生类中没有对基类的虚函数重新定义,那么派生类可以简单的继承直接使用虚函数。

3:定义一个指针,这个指针初始指向基类对象,后面可以通过此指针,指向同一类族中需要调用该函数的对象。

4:虚函数指针:在含有虚函数类的对象中,指向虚函数表,在运行时确定。

5:虚函数表:在程序只读数据段,存放虚函数指针,如果派生类实现了基类的某个虚函数,则在虚表中覆盖原本基类的那个虚函数指针,在编译时根据类的声明创建。

所以为了解决上述问题:我们可以将 Base类中的 func()函数定义为 虚函数

#include<iostream>
#include<string>
using namespace std;
class Base {
public:
	 virtual void func() {
		cout << "Base func 调用了" << endl;
	}
};

class Son :public Base {
public:	
	void func() {
		cout << "son func 调用了" << endl;
	}
};

int main() {
	Son s;
	Base *base;
	base = &s;
	s.func();
	(*base).func();
	return 0;
}

 

运行结果可知:通过改变 指针 base 的指向,可以成功调用 Son类的 func 函数,符合我们的预期。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值