(c++)virtual关键字的作用,多态的原理(详细)
创始人
2025-01-11 09:05:42
0

1.viirtual修饰的两种函数

virtual 修饰的函数有两种,一个是虚函数,一个是纯虚函数。

2.虚函数与纯虚函数的异同之处

1.虚函数与纯虚函数的相同之处

虚函数和纯虚函数都重写的一种,什么是重写呢?重写是指在子类中写和父类中返回值相同,函数类型相同,函数参数相同,但函数实际实现不同的函数。可以说是子类对父类函数的重写。重写函数的格式就是在函数类型前加上关键字virtual。下面举个栗子

​ #include using namespace std; class person {     public:         virtual void creature() {  cout<<"i'm person"<

此时父类中creature函数与子类中creature函数构成重载。结合继承的知识的我们知道这里不用加virtual代码也不会报错因为子类中creature函数与父类中creature函数构成隐藏。看似virtual没什么重要之处,实际virtual最重要的用法在于多态。

2.虚函数与纯虚函数的不同之处

1.格式上的不同

变成虚函数只需要在函数最前面加上关键字virtual就行,而纯虚函数是在虚函数的基础上在函数名的最后加上=0.举个栗子

​ #include using namespace std; class person {     public:         virtual void creature() {  cout<<"i'm person"<

2.用法不同

虚函数一般用在多态上,而纯虚函数不同。在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。

2.虚表是什么?多态的底层原理

我们知道在类中只有成员变量才会占用类的空间,而函数是不再类空间中的,但是如果是虚函数就不同了,虚函数是会占用类的空间的,但是又不同于成员变量,虚函数的地址会放入到虚表中,而占空间的只是虚表的地址而已,也就是说一个类中不论有几个虚函数,其只占用了一个指针的内存

如图我定义了5个虚函数,在运行时,所有的虚函数的地址都会放在续表中,而存在于对象中的则是续表的地址(__vfptr)与成员变量。这样一个存放虚函数地址的称作续表,而__vfptr指针就是指向此表的指针。

1.多态的底层原理

多态的底层原理与虚表有关。我们知道多态的条件有

1. 必须通过基类的指针或者引用调用虚函数
2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写

其中条件二2调用的函数必须是虚函数,因为只有是虚函数才能根据对象的类型去找对象中虚表中的函数。

条件一必须通过基类的指针或引用调用虚函数。那为什么是基类呢,我们知道我们可以将派生类的指针或引用赋给基类的指针或引用。而反过来我们不可以将基类的指针或引用赋给派生类的指针或引用。这样一来无论是基类还是派生类,我们只要将对象传进去就可以接收到,而后根据指针类型去对应的虚表中查找函数。这样多态就实现了。所以要实现多态这两个条件都是必不可少的。

相关内容

热门资讯

第8分钟辅助(雀友会钻石辅助器... 第8分钟辅助(雀友会钻石辅助器潮汕麻将)竟然真的是有挂(详细辅助技巧教程)1、完成雀友会钻石辅助器潮...
第五分钟辅助(小程序微乐游戏辅... 第五分钟辅助(小程序微乐游戏辅助)一直有挂(详细辅助玩家教程)1、第五分钟辅助(小程序微乐游戏辅助)...
十分钟辅助(互游辅助)一直是有... 十分钟辅助(互游辅助)一直是有挂(详细辅助细节方法)该软件可以轻松地帮助玩家将互游辅助透视辅助提升到...
第十分钟辅助(新九哥脚本下载)... 第十分钟辅助(新九哥脚本下载)真是真的有挂(详细辅助靠谱教程)小薇(透视辅助)致您一封信;亲爱新九哥...
第3分钟辅助(约战丹东苹果辅助... 第3分钟辅助(约战丹东苹果辅助)好像存在有挂(详细辅助德州论坛);1、用户打开应用后不用登录就可以直...
9分钟辅助(江湖悠悠辅助脚本)... 9分钟辅助(江湖悠悠辅助脚本)真是存在有挂(详细辅助解说技巧);1、江湖悠悠辅助脚本透视辅助简单,江...
1分钟辅助(辅助软件购买平台)... 1分钟辅助(辅助软件购买平台)原来存在有挂(详细辅助技巧教程)1、全新机制【辅助软件购买平台软件透明...
十分钟辅助(天天开心王国辅助器... 十分钟辅助(天天开心王国辅助器)总是存在有挂(详细辅助玩家教你);1、在天天开心王国辅助器ai机器人...
七分钟辅助(开心泉州辅助器)其... 七分钟辅助(开心泉州辅助器)其实真的有挂(详细辅助2025教程)1、开心泉州辅助器机器人多个强度级别...
第五分钟辅助(多乐跑得快游戏辅... 第五分钟辅助(多乐跑得快游戏辅助脚本)真是是有挂(详细辅助教你教程)1、首先打开多乐跑得快游戏辅助脚...