私有繼承限制基類介面

當需要限制類的公共介面時,私有繼承很有用:

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