C++ 虚函数

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-02 06:40:58
1.虚函数:
  • 用virtual定义的非static实例成员函数,虚函数可表现多态性,非虚函数的执行效率比较高,但是不能表现多态性;
  • .虚函数总是有this,故参数后面可出现const 和 volatile,而staic成员函数无 this,故参数表后不可出现const 和 volatile,所以virtual 和 static 不能同时出现,否则关于this是矛盾的;
  • 动态多态:重载函数表现的是静态(编译时)多态性,虚函数表现的是动态(运行时)的多态,多态一般指动态的编译;
  • 重载函数是静态多态函数,通过早期绑定调用重载函数,虚函数是动态多态函数,通过晚期绑定调用函数;晚期绑定是程序运行时由程序自己完成的,早期绑定是编译或者操作系统完成的;
  • 虚函数的晚期绑定通过存储在对象中的一个指向虚函数入口地址表VFT的指针完成;
  • 虚函数一般在基类的public或protected部分,在派生类中定义取代型函数时,函数原型必须和基类的虚函数必须完全相同;无论是否使用virtual保留字都将成为虚函数;
  • 虚函数只有在具有继承关系的类称重才需要表现多态,
    • union既不能作为基类,也不能作为派生类,故union不能定义为虚函数;
    • 构造对象时类型是确定的,不需要根据类型不同表现为不同多态行为,故构造函数不能定义为虚函数;
    • 析构函数可通过父类指针,引用或delete调用,父类指针可能指向父类或子类对象,因此析构函数需要多态性;
  • 虚函数可声明或者自动称为inline函数,也可重载,缺省和省略参数;
    (虚函数一定是内联失败的:根据地址表取地址晚期绑定,内联失败);
  • 虚函数不能使用constexper 定义,故构造函数 可用 constexper定义,但是有虚基类的派生类构造不能使用constexper定义;
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!