zoukankan      html  css  js  c++  java
  • 理解virtual方法

    1、使用场景

      virtual方法的使用场景:父类告诉子类,继承接口,修改实现,从而可以面向接口编程。

      non-virtual方法的使用场景:父类告诉子类,继承接口和实现,从而可以代码复用。

    2、成员方法是一种封装技术,暴露给程序员。对于编译器而言,没有成员方法的概念,编译器会把成员方法编译为普通方法,方法的拥有者(也就是对象)转化为普通方法的形参,这个形参是const指针,名称为this,指向的类型是方法拥有者的类型。

    3、编译器编译的时候,只知道指针的表面类型,正是这个表面类型引导编译器去解释指向对象的大小和内容,那么问题来了?

      对于non-virtual方法,子类继承接口和实现,继承的方法中,this指针的表面类型是什么? 答案是:Base

      对于virtual方法,子类继承了接口,修改了实现,重写的方法中,this指针的表面类型是什么?答案是:Derived

    4、思考一下,运行时多态,为什么一定要标记一下方法是virtual?

      考虑,Base和Derived都有一个方法Say,形参表一样(这里会发生隐藏)。

      Base::Say() 转化为Say(Base* const this),

      Derived::Say()转化为Say(Derived* const this),

      Base* pb = new Derived();

      现在调用pb->Say(); 分析一下,调用父类还是子类方法?

      pb->Say()转化为 Say(pb); 编译器只知道表面类型,根据表面类型决议方法,pb表面类型是Base,因此调用Base::Say,也就是说,指向子类的父类指针不能完成运行时多态。

      通过给父类的方法加上一个virtual,告诉编译器,不要通过上面的方式决议方法。

  • 相关阅读:
    【onenet-edp传输】1、调试上报数据点和端对端透传
    【PYQT5快速开发】重定义边框、QSS美化皮肤主题
    MySQL
    Flask-Login一个账号单用户在线
    DataTable按钮,排序,单元格颜色
    python
    MegaCli64 raid对应关系
    openstack server status
    js中使用JSON.parse转换json
    linux使用pyodbc和freetds连接sqlserver
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3487927.html
Copyright © 2011-2022 走看看