虚析构函数与纯虚函数/抽象类
请说明为什么基类析构函数需要声明为virtual、纯虚函数的作用、抽象类的概念和限制,以及接口类的设计模式。
回答
苦行僧
虚析构函数:
- 基类析构函数必须声明为virtual,否则通过基类指针删除派生类对象时,只调用基类析构函数,派生类资源无法释放,导致内存泄漏。
Base* p = new Derived();
delete p; // 如Base析构非virtual,只调用~Base()
纯虚函数:
- 形如
virtual void func() = 0;,在基类不提供实现(或提供默认实现)。 - 包含纯虚函数的类称为抽象类,不能实例化。
抽象类:
- 不能创建对象,但可以有指针/引用。
- 派生类必须实现所有纯虚函数才能实例化。
- 可包含普通成员变量和成员函数。
接口类:
- C++中常用只有纯虚函数的类模拟接口(类似Java/C#的interface)。
- 通常不包含数据成员、构造函数(或为protected)。
- 推荐使用虚析构函数(即使纯虚,提供空实现
virtual ~Interface() = default;)。 - 现代C++可用concepts(C++20)替代部分接口需求。