虚函数

1.析构函数为什么是虚拟的?

创建一个子类对象时,会先调用基类构造函数,再调用子类构造函数。

而撤销一个基类时,如果基类的析构函数为虚拟函数,则会先调用子类的析构函数,再调用基类的析构函数。

而如果基类的析构函数不是虚函数,撤销基类时,则只会调用基类的析构函数,而不会释放子类占据的内存,造成内存泄露。

2.是否可以把每个函数都声明为虚函数?

虚函数是由代价的,每个虚函数对象都要维护一个虚表,会产生系统开销。

3.构造函数可以是虚函数吗,为什么?

不能。虚函数允许调用一个只知道接口而不知道具体类型的函数,但创建对象时必须知道对象的准确类型。

4.虚函数是怎么实现的?纯虚函数是怎样实现的?

当一个包含虚函数的对象被创建时,会在头部附加一个指针,指向虚函数表,这个虚函数表保存了对象所有虚函数的入口地址。

调用虚函数时,会根据虚函数表找到入口地址。

纯虚函数相当于一个占位符,现在虚函数表中占据一个位置,当派生类实现后再把真正的函数指针填进去。

5.虚继承的作用

虚继承用于解决多重继承所造成的菱形结构。

6.什么是多态,多态的作用

多态是对于不同对象接收相同消息时产生的不同动作。可以概括为一个接口,多种方法,允许子类类型的指针赋给父类类型的指针。

①隐藏实现细节,是代码能模块化,扩展代码模块,实现代码重用。

②接口重用。

原文地址:https://www.cnblogs.com/SnailProgramer/p/4496411.html