私有继承的一个很好的用例是 Listener/Observer 事件接口。
私有对象的示例代码:
class AnimatableListener {
public:
virtual void Animate(float delta_time);
};
class BouncyBall : public AnimatableListener {
public:
void TossUp() {}
private:
void Animate(float delta_time) override { }
};
对象的一些用户想要父功能,而一些用户想要子功能:
class AnimationList {
public:
void AnimateAll() {
for (auto & animatable : animatables) {
// Uses the parent functionality.
animatable->Animate();
}
}
private:
vector<AnimatableListener*> animatables;
};
class Seal {
public:
void Dance() {
// Uses unique functionality.
ball->TossUp();
}
private:
BouncyBall* ball;
};
这样就AnimationList可以保存对父级的引用并使用父级功能。而Seal持有对孩子的引用并使用独特的孩子功能并忽略父母的。在此示例中,不Seal应该调用Animate. 现在,如上所述,Animate可以通过转换为基础对象来调用,但这更困难,通常不应该这样做。