07 December 2022

C++ 核心指南目录

C.122: Use abstract classes as interfaces when complete separation of interface and implementation is needed

理由

表达应用二进制接口范围。

例子

struct Device {
    virtual ~Device() = default;
    virtual void write(span<const char> outbuf) = 0;
    virtual void read(span<char> inbuf) = 0;
};

class D1 : public Device {
    // ... data ...

    void write(span<const char> outbuf) override;
    void read(span<char> inbuf) override;
};

class D2 : public Device {
    // ... different data ...

    void write(span<const char> outbuf) override;
    void read(span<char> inbuf) override;
};

用户可以通过 Device 的接口无差别的使用 D1D2 。进一步,如果我们更新了 D1D2 ,变得二进制不兼容,我们依然可以确保使用 Device 访问所有接口。