答:防止内存泄漏,正确析构指向派生类实例的基类指针。
TIPS:如果不是虚析构函数,基类指针被释放不会调用派生类的析构函数。
答:是的,virtual修饰符会被隐形继承的,virtual可加可不加,子类覆盖它的函数不加virtual也能实现多态。
答:错误,编译器默认生成构造函数。
答:
隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;
接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。
答:构造函数的调用顺序:基类构造函数—对象成员构造函数—派生类(当前类)构造函数;析构函数的调用顺序与构造函数相反。
答:引用必须被初始化,指针不必。引用初始化以后不能被改变,指针可以改变所指的对象。不存在指向空值的引用,但是存在指向空值的指针。
答:C++中,构造函数不可以是虚函数,而析构函数可以且常常是虚函数。
当类中声明虚函数时,编译器会在类中生成一个虚函数表,虚函数表是一个存储成员函数指针的数据结构。
虚函数表是由编译器自动生成与维护的,virtual成员函数会被编译器放入虚函数表中,当存在虚函数时,每个对象都有一个指向虚函数的指针(vptr指针)。在实现多态的过程中,父类和派生类都有vptr指针。
vptr的初始化:当对象在创建时,由编译器对vptr指针进行初始化。在定义子类对象时,vptr先指向父类的虚函数表,在父类构造完成之后,子类的vptr才指向自己的虚函数表。
如果构造函数是虚函数,那么调用构造函数就需要去找vptr,而此时vptr还没有初始化。
因此,构造函数不可以是虚函数。
答:两数相减的值,判断是否在一定范围内,因为浮点数不精确。