1. 什么是多态 ?其有哪些实现方式,不同实现方式有河区别 ?
多态是:不同类的对象收到相同的消息时,得到不同的结果。
方法的重载和重写,都是实现多态的方式。
重载,是编译时的多态性。其发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载。
重写,是运行时的多态性。其发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求,不能根据返回类型进行区分。
2. const, static 有啥区别 ?
const,就是只读的意思,只在声明中使用。
static, 规定作用域和存储方式。
(1)对于局部变量,
static 规定其为静态存储方式, 每次调用的初始值为上一次调用的值, 调用结束后存储空间不释放。
(2)全局变量, 如果以文件划分作用域的话, 此变量只在当前文件可见;对于static函数也是在当前模块内函数可见。
函数 :
const,
返回只读变量的函数。某个对象生存期内是常量,而对于整个类而言却是可变的。
const常量成员变量不能在类定义处初始化,只能通过构造函数初始化列表进行,并且必须有构造函数。
static,
规定此函数只在当前模块可见。
类的静态成员函数,成员变量是和类相关的,不是和类的具体对象相关,即使没有具体的对象,也能调用类的静态成员函数,成员变量。
static静态成员变量不能在类内部初始化。
类:
const,
一般不修饰类。
static,
C++中似乎没有静态类这个说法, 一般还是拿类当特殊的变量来看。
3. 对虚函数理解 ?
虚函数,是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这样的函数调用发生在运行阶段,称为动态联编。其是泛型技术之一。
泛型技术:使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。
虚函数的工作原理
编译器处理虚函数的方法:
为每个类对象,添加一个隐藏成员,其保存了一个指向函数地址数组的指针,称为虚表指针(vptr),这种数组成为虚函数表(virtual function table, vtbl)。即:
(1)每个类,使用一个虚函数表(虚函数的地址表);
(2)每个类对象,用一个虚表指针;
(3)派生类对象,也将包含一个虚表指针,指向派生类虚函数表。
(4)如果基类中的虚方法没有在派生类中重写,那么派生类将继承基类中的虚方法。
(5)派生类中虚函数表,将保存基类中未被重写的虚函数的地址。
(6)如果派生类中定义了新的虚方法,则该虚函数的地址也将被添加到派生类虚函数表中。
调用虚函数
程序将查看存储在对象中的虚函数表地址,转向相应的虚函数表,使用类声明中定义的第几个虚函数,程序就使用数组的第几个函数地址,并执行该函数。
4. 析构函数可以为虚函数吗 ?
主要是基类指针指向子类对象的情况下,在基类销毁时,只调用基类的析构函数而不调用子类的析构函数,从而导致内存泄漏,所以需要虚函数机制来帮助系统' 识别 '需要释放资源。
5.构造函数为什么不能是虚函数?
虚函数采用的是虚调用的办法, 是一种可以在只知道部分信息的情况下正常工作的机制,只知道接口而不知道准确的对象类型的函数 。
但是,要创建一个类对象,必须要让构造函数知道对象的准确类型,所以构造函数不能为虚!
6.内存管理中的堆、栈 的区别 ?
栈:由系统自动分配,速度较快。但程序员是无法控制的。
堆:是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。
7. vector 释放的理解 ?
(1)直接声明的vector容器是一个普通变量,相当于一个未知大小的动态数组,不需要手动释放,超出作用于范围时会自动回收。
(2)如果是vector *vec = new vector<>( )这种方法动态创建的vector,则需要delete vector;
(3)如果vector里面存放的是元素而不是指针,这些元素会随vector的释放而自动释放;
(4)如果vector里面存放的是指针,并且指向自己new或malloc的数据,那么需要一个一个手动释放指针。也就是上面代码的情况。
网友评论