归纳编程学习的感悟,
记录奋斗路上的点滴,
希望能帮到一样刻苦的你!
如有不足欢迎指正!
共同学习交流!
🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言📝
成功的秘诀就在于多努力一次!
一起加油!
目录
一、前言:
二、虚函数的声明:
三、虚函数的调用:
💦 例:虚函数实现动态联编。
🔑说明:
四、总结:
五、共勉:
一、前言:
上一节中,基类的指针既可以指向基类的对象,又可以指向派生类的对象。但是,当它指向派生类的对象时,并没有按照期望调用派生类中的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++多态性的理解,请持续关注我哦!!!