私有继承限制基类接口

当需要限制类的公共接口时,私有继承很有用:

class A {
public:
    int move();
    int turn();
};

class B : private A {
public:
    using A::turn; 
};

B b;
b.move();  // compile error
b.turn();  // OK

此方法通过强制转换为 A 指针或引用来有效地阻止对 A 公共方法的访问:

B b; 
A& a = static_cast<A&>(b); // compile error

在公共继承的情况下,这种转换将提供对所有 A 公共方法的访问,尽管在派生 B 中防止这种方法的替代方法,如隐藏:

class B : public A {
private:
    int move();  
};

或私人使用:

class B : public A {
private:
    using A::move;  
};

那么对于这两种情况都有可能:

B b;
A& a = static_cast<A&>(b); // OK for public inheritance
a.move(); // OK