需要一些帮助了解私人 /保护 /公共继承

Need some help understanding private / protected / public inheritance

本文关键字:保护 继承 帮助 了解      更新时间:2023-10-16

当前,我正在学习OOP,并且我尝试了许多继承示例。我刚刚测试了此代码:

#include <iostream>
using namespace std;
class B 
{
    int a;
protected:
    B(int i=0)
    {
        a=i;
    }
    int get_b()
    {
        return a;
    }
};
class D: private B
{
public:
    D(int x=0): B(x) {}
    int get_a()
    {
        return get_b();
    }
};
int main()
{
    D d(-89);
    cout << d.get_a();
    return 0; 
}

为什么这起作用?为什么可以使用get_b()函数?为什么构造函数B(x)工作?如果我将protected更改为private,为什么不起作用?

以后的编辑:通过在构造函数和函数函数上使用protected关键字get_b()表示,如果继承是公共的,则派生的类具有加速性。但是,在这种情况下,通过使用私有继承,我希望构造函数和 get_b()函数与D类不可接受。

为什么可以使用get_b((函数?

因为get_b()protected,可以通过派生类使用。

为什么构造函数b(x(起作用?

同样的原因,它是protected,在这种情况下是通过派生类D访问的。

如果我更改为私有保护,为什么不起作用?

因为private成员仅通过类本身访问(在这种情况下为B(,并且它的朋友,D无法访问private B成员。

后来的编辑:通过在constructor和function get_b((上使用受保护的关键字,表示派生的类具有的act ,如果继承是public

您的声明中的粗体部分是不正确的。继承指定符表示,B成员将如何在D类的儿童和用户中访问,它不会将D类方法的访问更改为B的成员。

但是,在这种情况下,通过使用私有继承,我希望构造函数和get_b((函数与D类不可能。

您的期望是错误的。私有继承将使B类的成员无法访问B的儿童和D类的用户,并且不影响CC_25成员的可访问性。

实际上,公共,受保护和私人 sashitance 指定将适用于继承成员的最自由的访问控制。我的意思是:

公共

class Pub : public B

Pub继承的B的公共成员将在Pub本身和外部(以及从Pub派生的任何类(中访问。Pub继承的B的受保护成员将在Pub中和从Pub派生的类中访问。B的私人成员将无法在Pub中访问。

提出它的另一种方法:B的公共成员仍然公开,受保护的成员仍然受到保护,私人成员无法访问。

受保护

class Prot : protected B

Prot继承的B的公共成员和受保护的成员将像Prot的受保护成员一样,在类本身和从其派生的类中,但不是从外部衍生出来的。B仍然无法使用Prot的私人成员。

提出它的另一种方法:B的公共成员受到保护,受保护的成员仍然受到保护,私人成员无法访问。

私人

class Priv : private B

Priv继承的B的公共和受保护成员仅适用于Priv,而不可用于任何派生类(就像Priv的私人成员一样访问它们(。B的私人成员仍然无法使用Prot

提出它的另一种方法:B的公开和受保护的成员成为私人,私人成员无法访问。

私有/procected/public Sentaritance都是关于决定谁知道继承的。在公共继承中,所有外部代码都意识到这一点。在受保护的继承中,只有孩子们知道。在私有情况下,只有继承类才知道。最重要的是,相同的关键字适用于成员,但不受继承可见性的影响。如果班级意识到继承,则可以像往常一样可见成员。如果它不了解继承,它甚至不了解成员,无论是公共,私人或受保护的成员。

要回答您的特定问题,如果您创建了E类继承(公开(D类D,您将无法致电get_b,但您仍然可以致电get_a