关于c ++:受保护的继承是否允许派生类访问其基类的私有成员?


Does protected inheritance allow the derived class access the private members of its base class?

我真的对私有继承和受保护继承感到困惑。

1)在受保护继承中,公共成员和受保护成员成为派生类中的受保护成员。在私有继承中,一切都是私有的。然而,派生类永远不能访问基类的私有成员,对吗?在这两种情况下,派生类都可以访问公共成员和受保护成员。是吗?

2)我注意到派生类永远不会接触到基类的私有成员。那么为什么私人成员会被继承呢?


你在第1点上是正确的。从基类继承时指定privateprotectedpublic不会改变派生类本身的任何访问方式。这些访问说明符告诉编译器,当派生类的实例在其他地方使用时,或者如果派生类恰好用作其他类的基类,如何处理基类成员。

更新:以下内容可能有助于说明差异:

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?

    因为它们是基类的一部分,而您需要一个属于派生类的基类。注意,您仍然可以使用非重写的public/protected成员函数来操作基类中维护的某些状态(如果有的话)。


    1)你是对的。任何类型的继承都不允许访问私有成员(只有friend声明允许这样做)

    2)它们是"继承"的,从某种意义上说,派生类型的对象在存储在内存中时,包括派生和基的所有数据成员,包括基的私有成员。私有成员不能离开,因为当基方法在该对象上运行时,它们将需要访问基的私有成员。

    另外,在派生的方法中,基的私有成员的名称在技术上是在范围内的,但是如果您尝试访问它们,当然会得到一个编译错误。