c++八股之多态(持续更新)

c++多态

  • c++的多态,从绑定时间来看,能够分为静态多态动态多态,或者说是编译期多态运行时多态
  • 范型编程和模板编程经过模板的机制实现静态多态
  • 对象模型经过重载虚函数的机制实现静态多态和动态多态
1. inliine函数能够是虚函数码?

不能够,由于inline函数没有地址,没法将他存放到虚函数表中。c++

2. 静态成员能够是虚函数吗?

不能,由于静态成员函数中没有this指针,使用::的调用方式没法访问虚函数表,因此静态成员函数没法放进虚函数表。编程

3. 构造函数能够是虚函数吗?

不能够,由于对象中的虚函数指针是在对象构造的时候初始化的。数组

4. 析构函数能够是虚函数吗?什么场景下析构函数是虚函数?

cppreference:一条有用的方针是,任何基类的析构函数必须为公开且虚,或受保护且非虚
这个问题也就是说,是否应该容许指向基类的指针进行销毁派生类对象?若是是,则base的析构函数必须是公共的才能被调用,不然虚拟调用它会致使未定义的行为。不然,应该对其进行保护,以便只有派生类才能在本身的析构函数中调用它,这个析构函数也应该是非虚的,由于它不须要虚拟地运行。函数

5. 对象访问普通函数快仍是虚函数快?

若是是普通对象,是同样快的,若是是指针对象或者是引用对象,调用普通函数更快一些,由于构成了多态,运行时调用虚函数要先到虚函数表中去查找。这样而后才拿到函数的地址,这样就不如直接能够拿到函数地址的普通函数快。this

6.虚函数表指针被编译器初始化的过程怎么理解的?

当类中声明了虚函数是,编译器会在类中生成一个虚函数表VS中存放在代码段,虚函数表实际上就是一个存放虚函数指针的指针数组,是由编译器自动生成并维护的。虚表是属于类的,不属于某个具体的对象,一个类中只须要有一个虚表便可。同一个类中的全部对象使用同一个虚表,为了让每一个包含虚表的类的对象都拥有一个虚表指针,编译器在每一个对象的头添加了一个指针,用来指向虚表,而且这个指针的值会自动被设置成指向类的虚表,每个virtaul函数的函数指针存放在虚表中,若是是单继承,先将父类的虚表添加到子类的虚表中,而后子类再添加本身新增的虚函数指针,可是在VS编译器中咱们一般看不到新添加的虚函数指针,是编译器故意将他们隐藏起来,若是是多继承,在子类中新添加的虚函数指针会存放在第一个继承父类的虚函数表中。指针

7. 多态的分类

静态绑定的多态的是经过函数的重载来实现的。动态绑定的多态是经过虚函数实现的。code

8. 为何要引入抽象类和纯虚函数?

在不少状况下由基类生成对象是很不合理的,纯虚函数在基类中是没有定义的,要求在子类必须加以实现,这种包含了纯虚函数的基类被称为抽象类,不能被实例化,若是子类没有实现纯虚函数,那么它他也是一个抽象类。对象

9. 虚函数和纯虚函数有什么区别?

纯虚函数不在基类里实现,必需要在派生类里重写。
非纯虚函数,能够在基类实现,派生类能够实现,也能够不重写
虚函数既继承接口的同时也继承了基类的实现,纯虚函数关注的是接口的统一性,实现彻底由子类来完成。继承

相关文章
相关标签/搜索