c++ 多态
- c++ 的多态,从绑定工夫来看, 能够分为
动态多态
和动静多态
, 或者说是编译期多态
和运行时多态
。 - 范型编程和模板编程通过
模板
的机制实现动态多态 - 对象模型通过
重载
和虚函数
的机制实现动态多态和动静多态
1. inliine 函数能够是虚函数码?
不能够,因为 inline 函数没有地址,无奈将他寄存到虚函数表中。
2. 动态成员能够是虚函数吗?
不能,因为动态成员函数中没有 this 指针,应用:: 的调用形式无法访问虚函数表,所以动态成员函数无奈放进虚函数表。
3. 构造函数能够是虚函数吗?
不能够,因为对象中的虚函数指针是在对象结构的时候初始化的。
4. 析构函数能够是虚函数吗?什么场景下析构函数是虚函数?
cppreference: 一条有用的方针是,任何基类的析构函数必须为公开且虚,或受爱护且非虚
这个问题也就是说,是否应该容许指向基类的指针进行销毁派生类对象?如果是,则 base 的析构函数必须是公共的能力被调用,否则虚构调用它会导致未定义的行为。否则,应该对其进行爱护,以便只有派生类能力在本人的析构函数中调用它,这个析构函数也应该是非虚的,因为它不须要虚构地运行。
5. 对象拜访一般函数快还是虚函数快?
如果是一般对象,是一样快的,如果是指针对象或者是援用对象,调用一般函数更快一些,因为形成了多态,运行时调用虚函数要先到虚函数表中去查找。这样而后才拿到函数的地址,这样就不如间接能够拿到函数地址的一般函数快。
6. 虚函数表指针被编译器初始化的过程怎么了解的?
当类中申明了虚函数是,编译器会在类中生成一个虚函数表 VS 中寄存在代码段,虚函数表实际上就是一个寄存虚函数指针的指针数组,是由编译器主动生成并保护的。虚表是属于类的,不属于某个具体的对象,一个类中只须要有一个虚表即可。同一个类中的所有对象应用同一个虚表,为了让每个蕴含虚表的类的对象都领有一个虚表指针,编译器在每个对象的头增加了一个指针,用来指向虚表,并且这个指针的值会主动被设置成指向类的虚表,每一个 virtaul 函数的函数指针寄存在虚表中,如果是单继承,先将父类的虚表增加到子类的虚表中,而后子类再增加本人新增的虚函数指针,然而在 VS 编译器中咱们通常看不到新增加的虚函数指针,是编译器成心将他们暗藏起来,如果是多继承,在子类中新增加的虚函数指针会寄存在第一个继承父类的虚函数表中。
7. 多态的分类
动态绑定的多态的是通过函数的重载来实现的。动静绑定的多态是通过虚函数实现的。
8. 为什么要引入抽象类和纯虚函数?
在很多状况下由基类生成对象是很不合理的,纯虚函数在基类中是没有定义的,要求在子类必须加以实现,这种蕴含了纯虚函数的基类被称为抽象类,不能被实例化,如果子类没有实现纯虚函数,那么它他也是一个抽象类。
9. 虚函数和纯虚函数有什么区别?
纯虚函数不在基类里实现,必须要在派生类里重写。
非纯虚函数,能够在基类实现,派生类能够实现,也能够不重写
虚函数既继承接口的同时也继承了基类的实现,纯虚函数关注的是接口的统一性,实现齐全由子类来实现。