ここで誰もが「いいえ」と言っています。私は "はい、それはは意味する"と言う。継承private
を作る
class VirtualBase {
public:
virtual void vmethod() = 0;
// If "global" is an instance of Concrete, then you can still access
// VirtualBase's public members, even though they're private members for Concrete
static VirtualBase *global;
};
// This can also access all of VirtualBase's public members,
// even if an instance of Concrete is passed in,
void someComplicatedFunction(VirtualBase &obj, ...);
class Concrete : private VirtualBase {
private:
virtual void vmethod();
public:
void cmethod() {
// This assignment can only be done by Concrete or friends of Concrete
VirtualBase::global = this;
// This can also only be done by Concrete and friends
someComplicatedFunction(*this);
}
};
あなたはクラスの外からVirtualBase
のメンバーにアクセスできないことを意味するものではありません、それはあなたがConcrete
を参照することにより、これらのメンバーにアクセスできないことを意味します。しかし、Concrete
とその友達はConcrete
のインスタンスをVirtualBase
にキャストできます。誰でも公開メンバーにアクセスできます。単純に、
Concrete *obj = new Concrete;
obj->vmethod(); // error, vmethod is private
VirtualBase *obj = VirtualBase::global;
obj->vmethod(); // OK, even if "obj" is really an instance of Concrete
私は「いいえ」と言っていません。私の答えを見てください。 :) – iammilind