我对私有继承和受保护的继承感到困惑.
1)在受保护的继承中,public和protected成员在派生类中成为受保护的成员.在私人继承中,一切都是私人的.但是,派生类永远不能访问基类的私有成员,是吗?派生类可以在两种情况下访问公共成员和受保护成员.是对的吗?
2)我注意到派生类永远不会触及基类的私有成员.那么为什么私人成员继承了?
e.J*_*mes 36
你在第一点是正确的.指定private,protected或public从基类继承不会改变任何东西访问明智的派生类本身时.这些访问说明符告诉编译器在其他地方使用派生类的实例时如何处理基类成员,或者派生类恰好用作其他类的基类.
更新:以下内容可能有助于说明差异:
class Base
{
private: int base_pri;
protected: int base_pro;
public: int base_pub;
};
Run Code Online (Sandbox Code Playgroud)
对于从base派生的类:
class With_Private_Base : private Base { void memberFn(); };
class With_Protected_Base : protected Base { void memberFn(); };
class With_Public_Base : public Base { void memberFn(); };
// this would be the same for all of the above 3 classes:
void With_PXXX_Base::memberFn()
{
base_pri = 1; // error: `int Base::base_pri' is private
base_pro = 1; // OK
base_pub = 1; // OK
}
Run Code Online (Sandbox Code Playgroud)
对于从3个派生类派生的类:
class A : public With_Private_Base { void memberFn(); }
void A::memberFn()
{
base_pri = 1; // error: `int Base::base_pri' is private
base_pro = 1; // error: `int Base::base_pro' is protected
base_pub = 1; // error: `int Base::base_pub' is inaccessible
}
class B : public With_Protected_Base { void memberFn(); }
void B::memberFn()
{
base_pri = 1; // error: `int Base::base_pri' is private
base_pro = 1; // OK
base_pub = 1; // OK
}
class C : public With_Public_Base { void memberFn(); }
void C::memberFn()
{
base_pri = 1; // error: `int Base::base_pri' is private
base_pro = 1; // OK
base_pub = 1; // OK
}
Run Code Online (Sandbox Code Playgroud)
对前三个派生类的外部访问:
void main()
{
With_Private_Base pri_base;
pri_base.base_pri = 1; // error: `int Base::base_pri' is private
pri_base.base_pro = 1; // error: `int Base::base_pro' is protected
pri_base.base_pub = 1; // error: `int Base::base_pub' is inaccessible
With_Protected_Base pro_base;
pro_base.base_pri = 1; // error: `int Base::base_pri' is private
pro_base.base_pro = 1; // error: `int Base::base_pro' is protected
pro_base.base_pub = 1; // error: `int Base::base_pub' is inaccessible
With_Public_Base pub_base;
pub_base.base_pri = 1; // error: `int Base::base_pri' is private
pub_base.base_pro = 1; // error: `int Base::base_pro' is protected
pub_base.base_pub = 1; // OK
}
Run Code Online (Sandbox Code Playgroud)