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

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

一起加油!

目录

一、前言:

二、虚函数的声明:

三、虚函数的调用: 

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

🔑说明:

四、总结:

五、共勉: 


一、前言:

        上一节中,基类的指针既可以指向基类的对象,又可以指向派生类的对象。但是,当它指向派生类的对象时,并没有按照期望调用派生类中的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++多态性的理解,请持续关注我哦!!! 

  • 49
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梵豪

你的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值