C++中的虚函数的作用主要是实现了多态的机制。基类定义虚函数,子类可以重写该函数;在派生类中对基类定义的虚函数进行重写时,需要再派生类中声明该方法为虚方法。

当子类重新定义了父类的虚函数后,当父类的指针指向子类对象的地址时,[即B b; A a = & b;] 父类指针根据赋给它的不同子类指针,动态的调用子类的该函数,而不是父类的函数(如果不使用virtual方法,请看后面★),且这样的函数调用发生在运行阶段,而不是发生在编译阶段,称为动态联编。而函数的重载可以认为是多态,只不过是静态的。注意,非虚函数静态联编,效率要比虚函数高,但是不具备动态联编能力。

★如果使用了virtual关键字,程序将根据引用或指针指向的对象类型来选择方法,否则使用引用类型或指针类型来选择方法。

下面的例子解释动态联编性:

class A{private:int i;
public:A();A(int num) :i(num) {};virtual void fun1();virtual void fun2();};class B : public A{private:int j;
public:B(int num) :j(num){};virtual void fun2();// 重写了基类的方法
};// 为方便解释思想,省略很多代码
A a(1);
B b(2);
A *a1_ptr = &a;
A *a2_ptr = &b;// 当派生类“重写”了基类的虚方法,调用该方法时
// 程序根据 指针或引用 指向的  “对象的类型”来选择使用哪个方法
a1_ptr->fun2();// call A::fun2();
a2_ptr->fun2();// call B::fun1();
// 否则
// 程序根据“指针或引用的类型”来选择使用哪个方法
a1_ptr->fun1();// call A::fun1();
a2_ptr->fun1();// call A::fun1();

原文链接:https://blog.csdn.net/iFuMI/article/details/51088091

C++中虚函数的作用相关推荐

  1. 关于C++中虚函数的作用

    昨天去面试,面试官问道:虚函数有什么作用,我解释了半天也没解释清楚,其实说到底还是理解不够深刻,或者说简直没什么理解,连子类重写父类的普通函数和子类重写父类的虚函数的区别都不知道,真是弱爆了!!1 虚 ...

  2. c++中虚函数的作用(virtual)

    我们知道,在同一类中是不能定义两个名字相同.参数个数和类型都相同的函数的,否则就是"重复定义".但是在类的继承层次结构中,在不同的层次中可以出现名字相同.参数个数和类型都相同而功能 ...

  3. 虚函数的作用及其底层实现机制

    1. C++中虚函数的作用和多态 虚函数: 实现类的多态性 关键字:虚函数:虚函数的作用:多态性:多态公有继承:动态联编 C++中的虚函数的作用主要是实现了多态的机制.基类定义虚函数,子类可以重写该函 ...

  4. c 语言中虚方法有什么作用是什么,虚函数的作用?

    定义 定义:在某基类中声明为 virtual 并在一个或多个派生类中被重新定 义的成员函数[1] 语法:virtual 函数返回类型 函数名(参数表) {函数体;} 用途:实现多态性,通过指向派生类的 ...

  5. C++ 在继承中虚函数、纯虚函数、普通函数,三者的区别

    C++ 在继承中虚函数.纯虚函数.普通函数,三者的区别 1.虚函数(impure virtual) C++的虚函数主要作用是"运行时多态",父类中提供虚函数的实现,为子类提供默认的 ...

  6. c++中虚函数和纯虚函数定义

    只有用virtual声明类的成员函数,使之成为虚函数,不能将类外的普通函数声明为虚函数.因为虚函数的作用是允许在派生类中对基类的虚函数重新定义.所以虚函数只能用于类的继承层次结构中. 一个成员函数被声 ...

  7. C++引入抽象基类和纯虚函数的作用和目的

    为什么要引入抽象基类和纯虚函数? 主要目的是为了实现一种接口的效果. 原文链接:https://blog.csdn.net/weibo1230123/article/details/82014322 ...

  8. c语言中虚函数和纯虚函数,虚函数和纯虚函数的区别是什么?

    虚函数和纯虚函数的区别:1.纯虚函数只有定义,没有实现:而虚函数既有定义,也有实现的代码.2.包含纯虚函数的类不能定义其对象,而包含虚函数的则可以. 相关推荐:<C++视频教程> 虚函数( ...

  9. 【转载】什么是C++虚函数、虚函数的作用和使用方法

    我们知道,在同一类中是不能定义两个名字相同.参数个数和类型都相同的函数的,否则就是"重复定义".但是在类的继承层次结构中,在不同的层次中可以出现名字相同.参数个数和类型都相同而功能 ...

最新文章

  1. linux 毫秒 转换方法,linux-将抖动转换为毫秒
  2. [TJOI2013]最长上升子序列
  3. java、上转型对象
  4. MySQL安装及可能出现的问题
  5. linux搭建Django环境,linux下搭建python Django环境及启动一个示例
  6. Java实现MD5加密解密类
  7. 数学猜想验证步骤_10大仍未解开的数学难题
  8. Axure element 2.4.6元件库
  9. 如何删除360的防火墙模块(详解)
  10. java怎么打印课程表_自明排课系统如何打印?教你打印课表的方法
  11. python爬虫轻松下载某易云音乐
  12. 表贴电阻尺寸与什么有关_贴片电阻简介:功率大小与尺寸对应表
  13. oracle 日期格式筛选,oracle 日期格式怎么筛选
  14. 上传附件格式限制与内容校验
  15. 斑马打印机 GK888t打印标签一次出两张的解决办法
  16. Matlab中FFT运算加窗函数的验证
  17. 2019 浙江省赛部分题解(The 16th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple)
  18. 检测到域名被墙如何解决?域名被墙怎么快速恢复?
  19. 电动助力自行车平衡车新版欧盟EN 15194:2017已正式实施
  20. unity 一万个具有相同动画的物体渲染

热门文章

  1. windows10 设置始终以管理员身份运行cmd窗口
  2. FPGA——inout的用法
  3. 最新商标局注册商标,商标变更规费清单。
  4. 荒野白牡丹都有啥功效,白牡丹茶对人体的功效与作用
  5. python中的name mangle机制
  6. 哪个蓝牙耳机音质好又便宜?音质最好的国产蓝牙耳机推荐
  7. 创建一个score类
  8. ubuntu14.04显卡驱动问题(amd5600k集显7650d)
  9. c语言浮点数阶码表示,计算机浮点数表示中,阶码是什么?
  10. 小游戏的实现-----扫雷