1.虚函数:
- 用virtual定义的非static实例成员函数,虚函数可表现多态性,非虚函数的执行效率比较高,但是不能表现多态性;
- .虚函数总是有this,故参数后面可出现const 和 volatile,而staic成员函数无 this,故参数表后不可出现const 和 volatile,所以virtual 和 static 不能同时出现,否则关于this是矛盾的;
- 动态多态:重载函数表现的是静态(编译时)多态性,虚函数表现的是动态(运行时)的多态,多态一般指动态的编译;
- 重载函数是静态多态函数,通过早期绑定调用重载函数,虚函数是动态多态函数,通过晚期绑定调用函数;晚期绑定是程序运行时由程序自己完成的,早期绑定是编译或者操作系统完成的;
- 虚函数的晚期绑定通过存储在对象中的一个指向虚函数入口地址表VFT的指针完成;
- 虚函数一般在基类的public或protected部分,在派生类中定义取代型函数时,函数原型必须和基类的虚函数必须完全相同;无论是否使用virtual保留字都将成为虚函数;
- 虚函数只有在具有继承关系的类称重才需要表现多态,
union既不能作为基类,也不能作为派生类,故union不能定义为虚函数;- 构造对象时类型是确定的,不需要根据类型不同表现为不同多态行为,故构造函数不能定义为虚函数;
- 析构函数可通过父类指针,引用或delete调用,父类指针可能指向父类或子类对象,因此析构函数需要多态性;
- 虚函数可声明或者自动称为inline函数,也可重载,缺省和省略参数;
(虚函数一定是内联失败的:根据地址表取地址晚期绑定,内联失败); - 虚函数不能使用constexper 定义,故构造函数 可用 constexper定义,但是有虚基类的派生类构造不能使用constexper定义;
来源:https://blog.csdn.net/jzj_c_love/article/details/102731653