1.什么是多态?虚函数的实现原理是什么?
多态:针对同一指令,不同对象表现不同;
虚函数实现原理:当基类定义一个虚函数时候,就会在基类对象的存储布局之中产生一个虚函数指针(vfptr),该虚函数指针指向基类自己的虚函数表(虚表),虚表中存放的是虚函数的入口地址,当派生类继承基类的时候,就会在派生类对象的存储布局中产生一个虚函数指针(vfptr),该虚函数指针指向派生类的虚函数表(虚表),该虚表存放的是派生类的虚函数入口地址。
2.不能设置为虚函数的函数有哪些?构造函数能设置为虚函数吗?为什么?
不能设置为虚函数的函数:普通函数(非类的成员函数),构造函数,析构函数,友元函数,内联函数;
构造函数不能设为虚函数,因为:1.虚函数要在不同对象中产生不同动作,而如果构造函数定义成虚函数,那么对象都没产生,更没有动作了;
2.构造函数是为了初始化对象而产生的,而虚函数是为了在不了解细节的情况下也能正确处理对象。
3.在什么情况下析构函数要设置成虚函数?为什么?
在类里定义有虚函数时,特别是类内有申请的动态内存,需要清理和释放的时候;
因为:把基类的析构函数声明为虚的,此时,系统将先执行派生类对象的析构函数,然后再执行基类的析构函数;避免了基类指针指向派生类对象时,系统只执行基类的析构函数而不执行派生类的析构函数。
4.什么是纯虚函数?什么是抽象类?抽象类的作用是什么?
纯虚函数:一种特殊的虚函数,在基类中不对虚函数给出实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做;
抽象类:只要类中含有一个纯虚函数,该类就为抽象类;
抽象类作用:作为基类来派生新类,不能创建抽象类的对象。
5.什么是重载?什么是隐藏?什么是覆盖?他们之间的区别是什么?
重载:在同一个作用域中,函数名相同,但参数的类型、个数、顺序不同,即参数列表不一样;
覆盖:发生在基类与派生类中,虚函数的名字相同,参数列表也相同;
隐藏:发生在基类与派生类中,非虚函数的名字和参数列表相同,就会隐藏基类的同名函数,而且同名数据成员也有隐藏。