1、多态的作用?封装使得代码模块化,继承扩展已存在的代码,这二者都是实现代码重用,而多态实现的是借口重用,一个函数接口多种实现,靠的是虚函数。
2、多态与非多态的实质区别?函数地址是前期绑定还是后期绑定,编译期间确定函数调用地址的是前期绑定,是静态绑定,如函数重载的实现,函数的调用地址在运行的时候才能确定,属于后期绑定,是动态绑定,如多态的实现(常见用法:声明基类指针,指向任意子类对象,根据指向不同调用相应的虚函数)。
3、如果一个基类的某个成员函数定义为虚函数,那么会被派生类自动继承,即使省略了virtual,也是虚函数。
4、虚表的理解?只要类中有虚函数存在,那么该类对象会有一个虚表存在,用来记录这些虚函数,用该类或子类实例化对象的时候,会多分配四个字节指向这些虚表。若派生类继承于多个基类,并且这些基类都存在虚函数,那么派生类都会继承,且派生类对象会分配相应多个指针地址空间,用来指向多个虚表。
5、纯虚函数与抽象类?声明方式:virtual 返回类型 函数名(参数列表) = 0;主要用于基类中此函数无实现的意义,且起到统一接口的作用。只要类中有纯虚函数,此类就是抽象类,不能用来实例化对象,纯虚函数不能被自动继承,派生类若不给出重定义,给出具体实现,此派生类也为抽象类。
6、虚析构函数,构造函数不能声明为虚函数,析构函数可以,一般,如果类中定义了虚函数,析构函数也定义为虚,特别当类中有动态内存需要释放的时候。例如,A是基类B是派生类,A* pa = new B;delete pa; 若析构函数不定义为虚,那么派生类的析构函数不会被调用,有可能造成内存泄露。如定义为虚,先调用B类的析构函数,然后会回调A类析构函数。
7、虚函数不能定义为static的原因,本身就是动态的,和static矛盾。
8、虚函数只有通过指针、引用形式调用才可以实现多态,通过对象名调用,实现的是静态绑定。