CppCoreGuidelines I.25 用空抽象类作为类层级的接口
31 March 2022
I.25: Prefer empty abstract classes as interfaces to class hierarchies
理由
抽象类是空的,除了 static
成员,没有其他成员数据。比有状态的基类更稳定。
反例
含有数据的类
class Shape { // bad: interface class loaded with data public: Point center() const { return c; } virtual void draw() const; virtual void rotate(int); // ... private: Point c; vector<Point> outline; Color col; };
这会要求所有继承的子类去计算 center
。可能在子类中 center
的值从来不会用到。同样的,不是所有形状 Shape
都有颜色 Color
,还有些形状可能没有轮廓,只是由几个点组成。
用抽象类会更好:
class Shape { // better: Shape is a pure interface public: virtual Point center() const = 0; // pure virtual functions virtual void draw() const = 0; virtual void rotate(int) = 0; // ... // ... no data members ... // ... virtual ~Shape() = default; };
强化
- (简单)如果一个叫 C 的类,它的指针或引用赋值给 C 的基类指针或引用,而基类又有成员数据。警告。