WeHack BBS
C++类继承的一些问题 - 可打印的版本

+- WeHack BBS (https://bbs.wehack.space)
+-- 版块: 计算机技术 (https://bbs.wehack.space/forum-5.html)
+--- 版块: 程序设计讨论区 (https://bbs.wehack.space/forum-14.html)
+--- 主题: C++类继承的一些问题 (/thread-213.html)



C++类继承的一些问题 - vimacs - 12-24-2020

代码:
class Base

class Derive: public Base

假设有如上基类和子类,使用时会有以下情形:


- Base和Derive定义了相同的函数func,那么Derive::func和Base::func功能不同,Derive里面的函数可以用Base::func来调用Base里面的func函数。
- 如果以上func是非虚函数,那么对于Derive类的obj, ((Base*)obj)->func调用的是Base::func;而func是虚函数的时候,这个语句调用的才是Derive::func.
- 如果Base不是虚基类,那么如果用 Base *obj = new Derive,那么 delete obj 的时候,虽然会释放 new 出来的所有内存(这个和free(void*)的行为一致),但是因为没调 Derive 的析构函数,所以如果 Derive 用了额外的堆空间(如std::vector),那么就会出现内存泄漏,可以通过 ASan 发现这样的内存泄漏。但是当前的GCC 10.2.0和Clang 11.0.0在编译时都没报任何警告。事实上,对非虚基类 Base 用这样的语句没任何意义。 
- 一个小技巧:C++11 和之后的标准可以直接用 ~Base() = default 让 Base 变成虚基类并定义一个虚析构函数。