c++中公共继承、私有继承和受保护继承之间的区别是什么?

我在SO上找到的所有问题都是针对具体案例的。


当前回答

class A 
{
    public:
       int x;
    protected:
       int y;
    private:
       int z;
};

class B : public A
{
    // x is public
    // y is protected
    // z is not accessible from B
};

class C : protected A
{
    // x is protected
    // y is protected
    // z is not accessible from C
};

class D : private A    // 'private' is default for classes
{
    // x is private
    // y is private
    // z is not accessible from D
};

重要提示:类B, C和D都包含变量x, y和z。这只是访问的问题。

关于受保护继承和私有继承的使用,你可以在这里阅读。

其他回答

我试着用下面的一张图片来解释继承。

主要的要点是父类的私有成员永远不能从派生类/子类直接访问,但是您可以使用父类的成员函数来访问父类的私有成员。 私有变量始终存在于派生类中,但派生类不能访问它。这就像他们的,但你不能用自己的眼睛看到,但如果你问一个来自父母类的人,然后他可以向你描述。

1)公共继承:

a.基类的私有成员在派生类中不可访问。

b.基类的受保护成员在派生类中仍然受保护。

c.基类的公共成员在派生类中保持为公共。

因此,其他类可以通过派生类对象使用基类的公共成员。

2)受保护遗产:

a.基类的私有成员在派生类中不可访问。

b.基类的受保护成员在派生类中仍然受保护。

c.基类的公共成员也成为派生类的受保护成员。

因此,其他类不能通过派生类对象使用基类的公共成员;但它们可用于派生的子类。

3)私人继承:

a.基类的私有成员在派生类中不可访问。

b.基类的Protected & public成员变成派生类的private成员。

因此,基类的成员不能被其他类通过派生类对象访问,因为它们在派生类中是私有的。甚至是Derived的子类 类不能访问它们。

任何继承自您的类的类都可以访问受保护的数据成员。但是,私有数据成员不能。假设我们有以下内容:

class MyClass {
    private:
        int myPrivateMember;    // lol
    protected:
        int myProtectedMember;
};

从扩展到这个类,引用这个。myPrivateMember不能工作。然而,这。myProtectedMember意志。这个值仍然是封装的,所以如果我们有一个myObj类的实例化,那么myObj。myProtectedMember不能工作,所以它的功能类似于私有数据成员。

为了回答这个问题,我想先用我自己的话描述一下成员的访问器。如果你已经知道这一点,那就跳到标题“下一步:”。

我知道有三种访问器:公共的、受保护的和私有的。

Let:

class Base {
    public:
        int publicMember;
    protected:
        int protectedMember;
    private:
        int privateMember;
};

所有知道Base的都知道Base包含publicMember。 只有子节点(及其子节点)知道Base包含protectedMember。 除了Base,没有人知道privateMember。

“意识到”,我的意思是“承认存在,从而能够获得”。

下一个:

同样的情况也发生在公共、私有和受保护的继承上。让我们考虑一个类Base和一个继承自Base的类Child。

如果继承是公共的,那么所有知道Base和Child的东西也知道Child从Base继承。 如果继承是受保护的,那么只有Child及其子元素知道它们从Base继承。 如果继承是私有的,那么除了Child之外没有人知道继承。

公共继承对IS-A关系建模。与

class B {};
class D : public B {};

每个D都是B。

私有继承为IS-IMPLEMENTED-USING关系建模(或者其他什么关系)。与

class B {};
class D : private B {};

D不是B,但每个D都在实现过程中使用了B。私有继承总是可以通过使用包含来消除:

class B {};
class D {
  private: 
    B b_;
};

这个D也可以用B实现,在这种情况下使用它的b_。与继承相比,包含在类型之间的耦合不那么紧密,因此通常应该首选它。有时使用容器代替私有继承不像私有继承那样方便。这通常是懒惰的蹩脚借口。

我想没有人知道什么是受保护的继承模型。至少我还没看到任何令人信服的解释。