C++虚函数

Posted 灰人

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++虚函数相关的知识,希望对你有一定的参考价值。

语法: virtual 返回值类型 函数名(参数)

为什么会有虚函数?为了实现多态。

 

什么是多态?多态就是当A是B的父类,可以通过A的指针来调用实际B的同名函数。这样,A就有了多种形态,多态的本质是使用不变的代码实现可变的算法。

 

什么是虚函数表?虚函数是通过虚函数表来实现的,用父类的指针操作一个子类的时候,虚函数表指明了实际所应该调用的函数。一个类的虚函数记录了该类全部虚函数的地址。

  虚函数表eg:假设pa指针指向的类型是A*,则pa->fun()执行为:取出pa指针所指的前4个字节就是对象所属类的虚函数表地址,通过虚函数表地址找到虚函数表,通过表查找到具体函数的地址,根据函数的地址调用虚函数。

 

虚函数表是什么时候构建的?程序构建分为“预编译、编译、汇编和链接”四个过程,虚函数表是在预编译的时候构建的,存在对象里。

 

程序构建预编译、编译、汇编和链接四个过程都干了什么?

1.预编译也叫预处理,进行宏替换、条件编译、头文件展开,去点

2.编译阶段,进行语义语法检测,没有错误后将C文件编译成汇编文件

3.汇编阶段,将汇编文件转换成可执行的机器指令

4.链接阶段,要把所有的目标文件以及所依赖的库文件链接到一起生成可执行程序

 

为什么C语言中没有多态或者说不能重载?

编译阶段的时候会将函数重命名,在函数名前加下划线,同名函数在符号表中生成的函数名一样所以不能重载。

C++在编译过程中对函数重命名的规则保证了重载函数在重命名后函数名的唯一性:新函数名 = 作用域 + 原始函数名+参数列表

 

能不能换个人话来说?

  多态,家长会得派一个家长去,老师让你爸去,但是你爸有事让你爷爷去了,这可以。开会之前老师并不知道你家谁来,你爸你爷谁来都行。(允许把子类类型的指针赋值给父类类型的指针)

  静态多态和动态多态,家长会回来了你爷爷告诉你爸拿点东西揍你一顿(虚函数),你爸(派生类)拿了个大铁棍(虚函数实现)揍了你一顿,这叫“一个接口,多种方法”即动态多态。你爷爷让你爸别用铁棍了,那个犁地用的犁头就挺好用的(运算符重载),这叫静态多态。

 

 

  

 

以上是关于C++虚函数的主要内容,如果未能解决你的问题,请参考以下文章

C++中的虚函数以及虚函数表

探索c++虚函数表

c++ 虚函数和纯虚函数

c++中,虚函数能不能被继承

C++ 虚函数(virtual) 和纯虚函数(pure virtual) 的区别

C++ 纯虚函数