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

时间:2010-01-28 18:31:01

标签: c++

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

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

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

5 个答案:

答案 0 :(得分:34)

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

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

class Base
{
    private:   int base_pri;
    protected: int base_pro;
    public:    int base_pub;
};

对于从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
}

对于从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
}

对前三个派生类的外部访问:

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
}

答案 1 :(得分:3)

1a)受保护的继承意味着“子”可以访问公共继承中的所有内容,但使用该对象的其他人只能看到子对象的公共接口,其父级中的任何内容都被隐藏。

1b)私有继承导致类的所有公共函数作为私有函数继承 - 这意味着它们不能从子进程调用或从对象的客户端访问。

2)私有成员是继承的,因为基类中的方法可能需要它们来操作。

答案 2 :(得分:2)

  1. 是的,这是正确的。派生类可以访问其基类的受保护和公共成员,派生类无法访问其基类的私有成员。

  2. 私有成员是由于以下原因而继承的:基类可以定义一个修改基类的私有成员的受保护或公共函数。派生类可以调用此函数,因此需要知道它正在访问的私有变量。

答案 3 :(得分:1)

  

1)在受保护的继承中,   公众和受保护的成员成为   派生的受保护成员   类。在私人继承中,   一切都是私密的。然而   派生类永远不能访问   基类的私有成员,是   那对吗?

  

派生类可以   访问公众并受到保护   这两种情况都是成员。是吗?

  

2)我注意到了私人会员   基类的永远不会   由派生类触及。所以为什么   私人成员是继承的吗?

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

答案 4 :(得分:0)

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

2)它们是“继承的”,因为Derived类型的对象在存储在内存中时,包括Derived和Base的所有数据成员,包括Base的私有成员。私有成员不能随便离开,因为当Base的方法运行在该对象上时,他们将需要访问Base的私有成员。

此外,Base的私有成员的名称在技术上属于Derived方法的范围,但是如果您尝试访问它们,当然会出现编译错误。