1.动态多态和静态多态(★)
答:
动态多态的设计思想:对于相关的对象类型,确定它们之间的一个共同功能集,然后在基类中,把这些共同的功能声明为多个公共的虚函数接口。各个子类重写这些虚函数,以完成具体的功能。客户端的代码(操作函数)通过基类的引用或指针来操作这些对象,对虚函数的调用会自动绑定到实际提供的子类对象上去。
从上面的定义也可以看出,由于有了虚函数,因此动态多态是在运行时完成的,也可以叫做运行期多态,这造就了动态多态机制在处理异质对象集合时的强大威力(当然,也有了一点点性能损失)。
静态多态的设计思想:对于相关的对象类型,直接实现它们各自的定义,不需要共有基类,甚至可以没有任何关系。只需要各个具体类的实现中要求相同的接口声明,这里的接口称之为隐式接口。客户端把操作这些对象的函数定义为模板,当需要操作什么类型的对象时,直接对模板指定该类型实参即可(或通过实参演绎获得)。
相对于面向对象编程中,以显式接口和运行期多态(虚函数)实现动态多态,在模板编程及泛型编程中,是以隐式接口和编译器多态来实现静态多态。
静态多态本质上就是模板的具现化。静态多态中的接口调用也叫做隐式接口,相对于显示接口由函数的签名式(也就是函数名称、参数类型、返回类型)构成,隐式接口通常由有效表达式组成。
2.命名空间的作用
答:命名空间是C++的新特性
例如在C++新特性出现之前我们写代码包含头文件的时候可能会这样写:
#include <iostream.h>
但在命名空间出现之后我们引入头文件可能会这样写:
#include <iostream>
using namespace std;
即使用了命名空间,命名空间的作用:他的作用是用来规定各种标识符的可见范围,为了解决在同一作用域下相同名称的变量或函数的冲突。
3.虚函数与纯虚函数
答:
虚函数:在代码中的定义模式:virtual int functionname(){
代码实现;}
纯虚函数:在代码中的定义模式:virtual int functionname()= 0;
虚函数是可以在基类中实现的,有具体的实现代码,定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。;
纯虚函数以=0的方式定义,是不可以在基类中进行具体函数实现的,定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须在子类中实现这个函数。
引入纯虚函数的原因:在很多情况下,基类本身生成对象是不合理的,例如动物可以作为基类派生出老虎、狮子,但动物本身生成对象则显得有些不合常理。纯虚函数的意义在于让所有的类对象(主要是派生类对象)都可以执行纯虚函数的动作,但类无法为纯虚函数提供一个合理的默认实现。所以类纯虚函数的声明就是在告诉子类的设计者,"你必须提供一个纯虚函数的实现,但我不知道你会怎样实现它"。
抽象类:拥有纯虚函数的类被称为抽象类,抽象类不可以被实例化。抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出。如果派生类中没有重新定义纯虚函数,而只是继承基类的纯虚函数,则这个派生类仍然还是一个抽象类。如果派生类中给出了基类纯虚函数的实现,则该派生类就不再是抽象类了,它是一个可以建立对象的具体的类。