构造函数
1. 构造函数能不能为虚函数?
构造函数不能为虚函数,原因如下:
a. 构造一个对象的时候,必须知道对象的实际类型;如果构造函数为虚函数,是在运行时确定实际类型的;
b. 虚函数的执行依赖于虚函数表,而虚函数表在构造函数中进行初始化工作,即初始化vptr(虚表指针),让其指向正确的虚函数表;如果构造函数位虚函数,是在运行时初始化虚函数表。
2. 构造函数的调用顺序?
当定义一个派生类对象时,构造函数的调用顺序如下:
基类的构造函数;对象成员的构造函数;派生类的构造函数。
3. 构造函数可以重载吗?
构造函数可以被重载,构造函数可以有多个且可以带参数
析构函数
1. 析构函数能不能为虚函数?
普通类的析构函数不需要定义为虚函数(定义为虚函数需要虚表指针和虚函数表,占用额外的内存)
基类的析构函数必须定义为虚函数,原因如下:
如果有基类指针指向派生类对象,那么用delete释放基类指针时,如果不定义成虚函数,派生类中派生的那部分无法析构,定义成虚函数的话,释放基类指针时可以释放掉子类空间,防止内存泄露。
2. 析构函数的调用顺序?
如果有基类指针指向派生类对象,那么用delete释放基类指针时,析构函数的调用顺序如下:
派生类的析构函数;对象成员的析构函数;基类的析构函数。
3. 析构函数可以重载吗?
析构函数不可以被重载,析构函数只能有一个,且不能带参数
虚函数
定义
虚函数声明要在函数返回值类型之前加virtual关键字;虚函数必须实现,如果不实现,编译器将报错
引入原因
定义一个函数为虚函数是为了允许用基类的指针来调用子类的该函数;虚函数只能借助于指针或者引用来达到多态的效果,虚函数是C++中用于实现多态(polymorphism)的机制。
纯虚函数
定义
在基类的虚函数原型后加“=0”,纯虚函数是在基类中声明的虚函数,要求派生类必须定义自己的实现方法;纯虚函数必须在派生类中重新声明函数(不要后面的=0,否则该派生类也不能实例化)
引入原因
定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的派生类必须实现这个函数。
在很多情况下,基类本身生成对象是不合情理的,含有纯虚拟函数的类称为抽象类,它不能生成对象。