0
点赞
收藏
分享

微信扫一扫

C++虚函数的实现原理(最通俗但并不想专业的解释)


这是比较专业术语解释C++虚函数的作用文章基础比较好的可以看这篇

接下来是我个人的理解,因为可能面试也需要,特此记录一下。

众所周知,虚函数是用来实现c++类的多态性的,先拿个示例代码给大家看,大家应该都能看懂,看完再解释

#include<iostream>  
using namespace std;

class A
{
public:
void foo()
{
printf("1\n");
}
virtual void fun()
{
printf("2\n");
}
};
class B : public A
{
public:
void foo() //隐藏:派生类的函数屏蔽了与其同名的基类函数
{
printf("3\n");
}
void fun() //多态、覆盖
{
printf("4\n");
}
};
int main(void)
{
A a;
B b;
A *p = &a;
p->foo(); //输出1
p->fun(); //输出2
p = &b;
p->foo(); //取决于指针类型,输出1
p->fun(); //取决于对象类型,输出4,体现了多态
return 0;
}

这个来自:​​javascript:void(0)​​  自己打代码太麻烦了

简单介绍一下,就是B类继承了A的fun函数,并重写了,所以调用B.fun的时候,其实就是重写了A的fun函数,实现了多态。

 

以上的讲解大家都懂了之后,接下来讲解的是原理:

先把专业解释的版本给大家看:

C++虚函数的实现原理(最通俗但并不想专业的解释)_多态

 

后面是我个人的理解:

其实很简单的来说,就是每个类对象其实本身都包含了指向该函数地址的指针,然后虚函数比较厉害的是,它本身包含了一个虚函数表,其实就是听起来很高端,其实就是记录了函数地址的表格,更容易理解的就是类似于把地址写在txt文档当中,执行程序本质上,就是从执行函数入口地址,找到地址,执行就ok。(这个才是多态的灵魂本质)

然后多态就是,假如子类没有实现父类的虚函数,父类就把自己本身的地址给他用,所以就不会多态,如果子类很争气,自己实现了,那父类就觉得没必要再把地址给他了,也就自己实现了多态了。

希望对大家有帮助!

举报

相关推荐

0 条评论