C++多态性——(3)动态联编的实现——虚函数

发布时间:2024年01月03日

归纳编程学习的感悟,
记录奋斗路上的点滴,
希望能帮到一样刻苦的你!
如有不足欢迎指正!
共同学习交流!
🌎欢迎各位→点赞 👍+ 收藏? + 留言?📝
成功的秘诀就在于多努力一次!

一起加油!

目录

一、前言:

二、虚函数的声明:

三、虚函数的调用:?

💦????????例:虚函数实现动态联编。

🔑说明:

四、总结:

五、共勉:?


一、前言:

? ? ? ? 上一节中,基类的指针既可以指向基类的对象,又可以指向派生类的对象。但是,当它指向派生类的对象时,并没有按照期望调用派生类中的GetArea()函数它仍然调用基类的GetArea()函数导致运行结果出错。要解决这个问题就要用虚函数。
????????虚函数是实现动态联编的基础,它是一种动态的重载方式,它允许在运行时建立函数调用与函数体之间的联系,也就是在运行时才决定如何动作,即动态联编。
????????基类的指针指向它的公有派生对象时,访问公有派生类中继承自基类的公有成员,可采用显式的方法,如GetArea(),或采用指针强制类型转换的方法:

p=&r;
p->GetArea();

? ? ? ? 但这两种方法都没有达到动态调用的效果,若要实现动态的调用功能,需要将函数Area0声明为虚函数。

二、虚函数的声明:

????????虚函数是一个在基类中声明为 virtual的函数,并在一个或多个派生类中被重新定义的成员函数,虚函数的声明格式如下:


????????????????????????virtual <返回值类型><函数名>(<参数表>);

????????虚函数的定义非常简单,就是基类的函数加上一个 virtual说明,基类中声明为 virtual的函数一般在派生类中需要重新定义。

????????在重新定义时,参数的类型和个数必须相同,一旦一个函数被声明为虚函数,则无论声明它的类被继承了多少层,在每一层派生类中该函数都继续保持虚函数特性。?

三、虚函数的调用:?

????????如果某个类中一个成员函数被说明为虚函数,意味着该成员函数在派生类中可能有不同的函数实现,当使用对象指针或对象引用调用虚函数时,采用动态联编方式,即在运行时进行关联或绑定。

💦????????例:虚函数实现动态联编。

#include<iostream>
using namespace std;
class mybase
{
	private:
		int a,b;
	public:
		mybase(int x,int y):a(x),b(y){    }
		virtual void show()
		{
			cout<<"基类 mybase"<<endl;
			cout<<a<<" "<<b<<endl;	
		}	
};
class myclass:public mybase
{
	private:
		int c;
	public:
		myclass(int x,int y,int z):mybase(x,y),c(z){ 	}
		void show()
		{
			cout<<"派生类 myclass"<<endl;
			cout<<"c="<<c<<endl; 
		}
};
int main()
{
	mybase mb(50,50),*pm;
	myclass mc(10,20,30);
	pm=&mb;
	pm->show();
	pm=&mc;
	pm->show();
	return 0;
}

🔑说明:

? ? ? ? (1)虚函数与重载不同,虚函数参数类型个数完全相同。
????????(2)定义一个基类的对象指针或者基类对象引用,就可以指向不同派生类的对象同时调用不同派生类的虚函数。这就是动态联编的结果。?

四、总结:

  • 虚函数的定义非常简单,就是基类的函数加上一个 virtual说明,基类中声明为 virtual的函数一般在派生类中需要重新定义。
  • 在重新定义时,参数的类型和个数必须相同,一旦一个函数被声明为虚函数,则无论声明它的类被继承了多少层,在每一层派生类中该函数都继续保持虚函数特性。?
  • 虚函数与重载不同,虚函数参数类型个数完全相同。
  • 定义一个基类的对象指针或者基类对象引用,就可以指向不同派生类的对象同时调用不同派生类的虚函数。这就是动态联编的结果。?

五、共勉:?

????????以上就是我对C++多态性——(3)动态联编的实现——虚函数的理解,希望本篇文章对你有所帮助,也希望可以支持支持博主,后续博主也会定期更新学习记录,记录学习过程中的点点滴滴。如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对C++多态性的理解,请持续关注我哦!!!?

文章来源:https://blog.csdn.net/2301_80585598/article/details/135373089
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。