虚函数的作用
来源:互联网 发布:热云数据融资 编辑:程序博客网 时间:2024/06/04 08:40
在某基类中申明为virtual的成员函数,并在一个或多个派生类中被重新定义,通过指向派生类的指针或引用,访问派生类中同名覆盖的成员函数。简单的说:那些被virtual关键字修饰的成员函数,就是虚函数。虚函数的作用,用专业术语来解释就是实现多态性
面试1:除了指针能引起多态,还有什么能引起多态?
这是面试的时候常问题目,引起多态方式有两种 :指针和引用
面试2:重载,重写,覆盖
重载这里就不讲了。 注意不同面试官会有不同叫法,其实重写就是覆盖,覆盖就是重写
虚函数的格式:
virtual void fun(int a)
下面举个虚函数实现多态的例子:
class A{ public: virtual void print(){cout<<"This is A"<<endl;} //基类声明为虚函数};class B : public A{ public: void print(){cout<<"This is B"<<endl;} //继承A后,同函数也就成了虚函数};int main(){ A a; B b; A *p1 = &a; A *p2 = &b; p1->print(); p2->print(); return 0;}
这里输出的结果就是This is A和This is B了。
上面输出的结果就是多态产生的
多态实现的机制:
由于这两个类中有虚函数存在,所以编译器就会为他们两个分别插入一段你不知道的数据,并为他们分别创建一个表。那段数据叫做vptr指针(虚函数指针),指向那个表。那个表叫做vtbl(虚函数表),每个类都有自己的vtbl,vtbl的作用就是保存自己类中虚函数的地址,我们可以把vtbl形象地看成一个数组,这个数组的每个元素存放的就是虚函数的地址,
首先是取出vptr的值,这个值就是vtbl的地址,再根据这个值来到vtbl这里,由于调用的函数A::fun()是第一个虚函数,所以取出vtbl中第一个值即为第一个虚函数的地址,这个值就是A::fun()的地址了,最后调用这个函数。现在我们可以看出来了,只要vptr不同,指向的vtbl就不同,而不同的vtbl里装着对应类的虚函数地址,所以这样虚函数就可以完成它的任务。
阅读全文
0 0
- 虚函数的作用
- 虚函数的作用
- 虚函数的作用
- 虚函数的作用
- 虚函数的作用
- 虚函数的作用
- 虚函数的作用
- 虚函数的作用
- 虚函数的作用
- 虚函数的作用
- 虚函数的作用
- 虚函数的作用
- 虚函数的作用
- 虚函数的作用
- 虚函数的作用
- 虚函数的作用
- 虚函数的作用
- 虚函数的作用
- Android数据库(SQLite)框架(7)——使用LitePal聚合函数
- 计算两段文本的相识度
- 25 web.xml配置详解及示例
- 用openssl进行rsa的加密与解密(linux,C++版)
- 多重背包问题
- 虚函数的作用
- NOIP2016 T5 蚯蚓
- 2、Hyperledger Fabric 交易流程
- struts.xml配置说明
- 机器学习常用算法总结
- Keepalived+LVS 安装部署文档
- mysql中有重复数据建唯一索引
- HYSBZ 1588: [HNOI2002]营业额统计(splay)
- 在Spring Boot框架下使用WebSocket实现消息推送