Does protected inheritance allow the derived class access the private members of its base class?
我真的对私有继承和受保护继承感到困惑。
1)在受保护继承中,公共成员和受保护成员成为派生类中的受保护成员。在私有继承中,一切都是私有的。然而,派生类永远不能访问基类的私有成员,对吗?在这两种情况下,派生类都可以访问公共成员和受保护成员。是吗?
2)我注意到派生类永远不会接触到基类的私有成员。那么为什么私人成员会被继承呢?
你在第1点上是正确的。从基类继承时指定
更新:以下内容可能有助于说明差异:
1 2 3 4 5 6 | class Base { private: int base_pri; protected: int base_pro; public: int base_pub; }; |
对于从基派生的类:
1 2 3 4 5 6 7 8 9 10 11 | 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 } |
号
对于从3个派生类派生的类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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 } |
对前三个派生类的外部访问:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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 } |
。
1a)受保护的继承意味着"子"可以访问公共继承中的所有内容,但是其他使用该对象的人只能看到子对象的公共接口,它的父对象中的任何内容都是隐藏的。
1b)私有继承导致类的所有公共函数都作为私有函数继承-这意味着不能从子级调用它们,也不能从对象的客户端访问它们。
2)私有成员是继承的,因为基类中的方法可能需要它们进行操作。
是的,这是正确的。派生类可以访问其基类的受保护成员和公共成员,而派生类不能访问其基类的私有成员。
私有成员被继承的原因如下:基类可以定义一个受保护的或公共的函数来修改基类的私有成员。派生类可以调用这个函数,因此需要知道它正在访问的私有变量。
1) in protected inheritance, the
public and protected members become
protected members in the derived
class. In the private inheritance,
everything is private. However, the
derived class can never access the
private members of the base class, is
that right?
号
对。
The derived class can
access the public and protected
members in both cases. Is that right?
号
对。
2) I noticed that the private members
of the base class will never be
touched by the derived class. So why
are the private members inherited?
号
因为它们是基类的一部分,而您需要一个属于派生类的基类。注意,您仍然可以使用非重写的
1)你是对的。任何类型的继承都不允许访问私有成员(只有
2)它们是"继承"的,从某种意义上说,派生类型的对象在存储在内存中时,包括派生和基的所有数据成员,包括基的私有成员。私有成员不能离开,因为当基方法在该对象上运行时,它们将需要访问基的私有成员。
另外,在派生的方法中,基的私有成员的名称在技术上是在范围内的,但是如果您尝试访问它们,当然会得到一个编译错误。