多态用一句话来总述就是:父类的指针或者引用指向基类的对象
多态分为两种:
编译时多态(静态多态):函数重载,运算符重载
运行时多态(动态多态):派生类,虚函数
静态多态:函数地址早绑定
动态多态:函数地址晚绑定
子类在构造前必须先构造父类,再构造子类,析构顺序相反
non-virtual函数:你不希望子类重写这个函数(override)
virtual函数:你希望子类重写这个函数,且你已经有了默认定义
pure-virtual函数:你希望子类一定要重写这个函数,且你对它没有默认定义
①构造函数可以设置为虚函数吗?
1.从存储空间角度。 虚函数对应一个vtable,这个vtable其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有实例化,也就是内存空间还没有,无法找到vtable,所以构造函数不能是虚函数。
2,从使用角度 构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀。所以构造函数没有必要是虚函数。虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。而构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用,因此也就规定构造函数不能是虚函数。
3、从实现上看,vbtl在构造函数调用后才建立,因而构造函数不可能成为虚函数
②虚析构函数
如果子类的成员变量有堆区开辟的空间,则需要用delete进行释放这块空间,若用一个父类指针指向一个子类对象,最后delete这个父类的指针的时候,只会调用父类中的析构函数,不会调用子类的析构函数,解决问题的方法是将父类的析构函数设置成虚析构函数~virtual Base()
③友元函数可以继承吗?
不能!友元只是能访问指定类的私有和保护成员的自定义函数,不是被指定类的成员,自然不能继承
④静态成员及静态成员函数能不能被继承
基类与派生类的静态成员函数与静态成员是共用一段空间的,即静态成员和静态成员函数是可以继承的。
⑤inliine函数可以实虚函数码?
不可以,因为inline函数没有地址,无法将他存放到虚函数表中。
⑥对象访问普通函数快还是虚函数快?
1、如果是普通对象访问效率是一样的
2、如果是指针或引用访问,访问普通函数更快
区别:主要在于指针或引用访问虚函数时需要在运行时通过查询虚函数表才能确定要调用的函数的真实地址,而其它形式的访问则在编译时就可以确定要调用函数的地址
⑦虚函数表时再什么阶段生成的?他存放在哪里?
虚函数表在编译阶段生成的,他一般存放再代码段,也就是常量区。
来源:CSDN
作者:Ther Meng
链接:https://blog.csdn.net/weixin_42226134/article/details/104189009