2020年3月2日 下午10:19
C++很“虚” - Acelit - 博客园
注:结合代码看,容易懂很多!

使用c++四“虚“的前提

作用:
- 虚基类:间接派生类只保存共同基类的一份成员(数据成员/函数成员),优化存储空间
- 虚函数:虚函数允许在派生类中重新定义与基类同名的函数,并且允许通过基类指针或引用来访问基类和派生类的同名函数
- 虚析构函数:防止内存泄漏
- 派生类析构函数无法从基类继承,在没有声明基类析构函数为虚函数时,基类指针释放时无法找到派生类析构函数地址,也就不能释放派生类对象所在内存空间。而将基类析构函数也声明为虚函数时,该基类所有派生类也将自动成为虚函数,所有虚析构函数的入口地址都会存放在一个虚函数表(指针数组)中,查找方便,这样就避免了无法调用派生类析构函数所造成的内存泄漏问题了。
总结:
- 何时我们需要考虑给基类声明虚析构函数?
- 虚析构函数是建立在虚函数的基础之上的,即在想使用基类指针访问派生类对象时必须要声明基类虚析构函数,不管基类是否需要析构函数;
- 因为虚函数表会占据一定的空间开销,在不存在上述1中情况时没有必要使用虚函数;
- 多态性:因为编译器只做静态的语法检查,无法确定调用对象,运行时才确定关联关系,所以多态性又分为静态多态性和动态多态性。
- 静态多态性(编译时的多态性,静态关联)是指在程序编译时就能够确定调用的是哪个函数,函数重载_运算符重载_通过对象名调用的虚函数都属于静态关联。
- 动态多态性(运行时多态性,动态关联,滞后关联)是指只有在程序运行时才能够确定操作的对象,通过虚函数实现。
补充:
- 虚函数是动态多态的基础!(不适用虚函数时,其实就是静态多态)