CppCoreGuidelines C.121 如果基类用来表示接口,请将其设为纯抽象类
06 December 2022
C.121: If a base class is used as an interface, make it a pure abstract class
理由
一个类如果不含有数据,会更加稳定。接口一般应该由公开的纯虚函数+一个默认或空的虚析构函数组成。
例子
class My_interface { public: // ...only pure virtual functions here ... virtual ~My_interface() {} // or =default };
例子
class Goof { public: // ...only pure virtual functions here ... // no virtual destructor }; class Derived : public Goof { string s; // ... }; void use() { unique_ptr<Goof> p {new Derived{"here we go"}}; f(p.get()); // use Derived through the Goof interface g(p.get()); // use Derived through the Goof interface } // leak
Derived
对象通过 Goof
的接口函数进行析构,因此它的字符串内存泄漏,因为
Goof
的析构函数并不会处理 Derived
的字符串析构。如果 Goof
有一个虚的析构函数,就可以确保 Derived
的析构正常。
强化
- (警告)如果某个类中有成员数据,又有一个不是从基类继承的可重载的虚函数(非
final
)