这是比较专业术语解释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; }
自己打代码太麻烦了
简单介绍一下,就是B类继承了A的fun函数,并重写了,所以调用B.fun的时候,其实就是重写了A的fun函数,实现了多态。
以上的讲解大家都懂了之后,接下来讲解的是原理:
先把专业解释的版本给大家看:
后面是我个人的理解:
其实很简单的来说,就是每个类对象其实本身都包含了指向该函数地址的指针,然后虚函数比较厉害的是,它本身包含了一个虚函数表,其实就是听起来很高端,其实就是记录了函数地址的表格,更容易理解的就是类似于把地址写在txt文档当中,执行程序本质上,就是从执行函数入口地址,找到地址,执行就ok。(这个才是多态的灵魂本质)
然后多态就是,假如子类没有实现父类的虚函数,父类就把自己本身的地址给他用,所以就不会多态,如果子类很争气,自己实现了,那父类就觉得没必要再把地址给他了,也就自己实现了多态了。
希望对大家有帮助!