一、使用&特性

1.可在任何方法上添加virtual,例:virtual void play();
2.继承性:一旦基类中为虚函数,子类将不会为非虚函数
3.优缺性:声明虚方法除了使程序慢一点点以外,没有任何缺点


二、说说为什么要用虚方法

因为当我们使用基类的引用或指针调用基类中定义的某个函数时,我们并不知道该函数真正的对象是什么类型(属于哪个类),因为它可能是一个基类的对象,也可能是一个子类的对象

#include <iostream>
using namespace std;class Base
{public:Base(int _x):x(_x){}virtual int get(){cout<<"Base的get"<<endl;return x;   }   private:int x;
};class Derived:public Base
{public:Derived(int _y):Base(_y),y(_y){}int get(){cout<<"Derived的get"<<endl;return y;}private:int y;
};int main()
{Base *a=new Derived(5);cout<<a->get()<<endl;return 0;
}

由以上代码可以看出,在基类亦或是子类中都有get的方法

若基类中没有virtual声明,其结果为

若基类中含有virtual声明,其结果为

可以看出,若不调用虚方法,编译器在编译的时候a是Base类的指针,所以编译器就认为a指针调用的方法是Base类里的方法,因为这样的执行效率是最快的,原理也就是对非虚函数的调用在编译的时候进行了绑定,这和通过对象(不是指针或引用)进行的函数调用也在编译是绑定一样

但是若通过指针或引用调用虚方法时,就会在运行时解析该调用,即在编译时是Base类的指针,但在运行时才确定是指向Derived的方法的,也只有这种情况下,对象的动态类型才有可能与静态类型不同

  • 所以这里我们显然要指向Derived的方法,所以必须要用virtual声明
  • 所以总结得:对虚函数调用运行时才被解析,对非虚函数调用时编译时就被解析了

三、基类and子类覆盖类型匹配

一个子类的函数如果覆盖了某个继承而来的虚函数,则形参类型与基类中被覆盖的方法要完全一样(包括返回类型),若虚函数的返回类型是类本身的指针或引用时,它们的返回类型可以不匹配

所以若改变上述代码中基类的名字,其他不变,那么因为基类和子类名字不同会导致异常


错误提示


四、注意点

1.若拿不准要不要使某个方法为虚方法,就声明为虚方法,优缺点前面已经说了,出来使程序慢一点点以外没有其他缺点
2.最好在基类里把所有方法都声明为虚方法
3.在实现一个多层次的类继承关系时,最顶级的基类应该只要虚方法
4.所以析构器都是虚方法,从编译的角度看,它只是普通方法,但如果不是虚方法,编译器会绑定编译时的版本,这样可能会多次析构基类里的成员,这对于析构器来说绝对是不安全的,会导致内存泄漏

C++(笔记)虚方法相关推荐

  1. .net框架读书笔记---虚方法

    接上一篇.net框架读书笔记---引用参数(ref/out), 一.虚方法调用机理 代码 namespace VirtualFunction { class Program { static void ...

  2. Spring.NET学习笔记10——方法的注入(基础篇) Level 200

    多数用户都会将容器中的大部分对象布署为singleton模式.当一个singleton对象需要和另一个singleton对象协作,或者一个非singleton对象需要和另一个非singleson对象协 ...

  3. C++:随笔6---new\delete\虚方法\抽象方法

    指针是一种专门用来存储内存地址的数据类型.(他存储的不是具体的数据而是别人的地址) 常用做法是:创建一个变量,再把这个变量的地址赋值给一个指针,然后就可以用指针去访问这个变量的值. 事实上在C和C++ ...

  4. 虚方法的调用是怎么实现的(单继承VS多继承)

    我们知道通过一个指向之类的父类指针可以调用子类的虚方法,因为子类的方法会覆盖父类同样的方法,通过这个指针可以找到对象实例的地址,通过实例的地址可以找到指向对应方法表的指针,而通过这个方法的名字就可以确 ...

  5. C++学习笔记24,方法重写与方法隐藏

    该博文仅用于交流学习.请慎用于不论什么商业用途.本博主保留对该博文的一切权利. 博主博客:http://blog.csdn.net/qq844352155 转载请注明出处: 方法重写.是指在子类中又一 ...

  6. C#面向对象(四)虚方法实现多态

    一.虚方法实现多态 1,创建一个people基类 using System; using System.Collections.Generic; using System.Linq; using Sy ...

  7. 虚方法、重写方法和抽象方法[转载]

    若一个实例方法的声明中含有 virtual 修饰符,则称该方法为虚方法 (virtual method).若其中没有 virtual 修饰符,则称该方法为非虚方法 (non-virtual metho ...

  8. 抽象类,虚方法,接口

    这三样很多人容易混淆,在此总结一下 1. 虚方法 Virtual 基类中定义了虚方法,派生类中可以实现,也可以不实现,因为虚方法是有方法体的,如果要实现,派生类中用override重写该方法. pub ...

  9. C# 多态(接口、虚方法、抽象类)的理解

    这几天正在做GDI+的一个练习程序,参考了<VC#.NET开发交互式CAD系统>这本书,书中的参考方法创建了许许多多的类和一个接口.开始我还在想接口有啥作用啊?是不是有点多此一举.然后就去 ...

最新文章

  1. [置顶]       安全-用户身份验证
  2. PHP的SQL注入攻击的技术实现以及预防措施
  3. 计算机的命令函数,数学建模的常用的命令和基本函数..doc
  4. SpringBoot中怎样对外开放一个接口返回Json数据
  5. 小米网关控制空调伴侣_小爱同学怎么控制灯?
  6. hantomjs能解析出html源码吗,网页源码是js js跳转后才是源码 怎么用易语言写 不使用超文本 有延时...
  7. 调用Xmlrpc接口
  8. u3d目标与摄像机之间的遮挡物变为透明
  9. 吴恩达《机器学习》笔记
  10. win10共享文件夹设置,本地组策略配置全攻略
  11. iframe标签用法详解
  12. 计算广告学中的GFP、GSP和VCG对比
  13. python爬虫爬取糗百成人图片多线程版本
  14. Opencv最新版本Opencv3.3.0集成了DNN神经网络模块
  15. 人生的意义无非就是在平淡中活着
  16. 干货|建模3D Max中常见问题
  17. ssrs报表服务器数据库配置文件,ReportingServicesService 配置文件
  18. 张一鸣应该接过张近东的枪
  19. 服务器被穷举法暴力爆破、攻击的简单应对方案。
  20. java-php-python-ssm商超销售系统计算机毕业设计

热门文章

  1. fastjson toJSONString 出错 Positioned Update not supported
  2. Vue全家桶快速开发指南
  3. MySql 索引的最左匹配原则举例详解
  4. 洛谷P4703 偷上网
  5. cadence原理图绘制零基础进阶1
  6. CefSharp初识--把网页移到桌面
  7. BIG+碧家国际社区集中式公寓项目爬取
  8. 《从零进阶!数据分析的统计基础》-2.描述性统计分析
  9. 【概率与统计】聊聊一些常见的概率分布
  10. 硬件虚拟化和软件虚拟化