31 March 2022

C++ 核心指南目录

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 的基类指针或引用,而基类又有成员数据。警告。