C++中保护与私有派生的区别


What is difference between protected and private derivation in c++

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Difference between private, public and protected inheritance in C++

C++中保护或私有派生的区别是什么?我想不出来,因为这两种方法似乎都限制了从派生类对象对基类成员的访问。


让我们考虑一个代码示例,说明使用不同的继承级别将允许(或不允许)什么:

1
2
3
4
5
6
7
8
9
10
11
 class BaseClass {};

 void freeStandingFunction(BaseClass* b);

 class DerivedProtected : protected BaseClass
 {
     DerivedProtected()
     {
         freeStandingFunction(this); // Allowed
     }
 };

DerivedProtected可以传给freeStandingFunction,因为它知道它来自BaseClass

1
2
3
4
5
 void freeStandingFunctionUsingDerivedProtected()
 {
     DerivedProtected nonFriendOfProtected;
     freeStandingFunction(&nonFriendOfProtected); // NOT Allowed!
 }

非友元(类、函数等)不能将DerivedProtected传递给freeStandingFunction,因为继承受到保护,因此在派生类之外不可见。私人继承也是如此。

1
2
3
4
5
6
7
 class DerivedFromDerivedProtected : public DerivedProtected
 {
     DerivedFromDerivedProtected()
     {
         freeStandingFunction(this); // Allowed
     }
 };

DerivedProtected派生的类可以看出它继承自BaseClass,因此可以传递给freeStandingFunction

1
2
3
4
5
6
7
 class DerivedPrivate : private BaseClass
 {
      DerivedPrivate()
      {
          freeStandingFunction(this); // Allowed
      }
 };

DerivedPrivate类本身知道它是从BaseClass派生出来的,所以可以把自己传给freeStandingFunction

1
2
3
4
5
6
7
class DerivedFromDerivedPrivate : public DerivedPrivate
{
     DerivedFromDerivedPrivate()
     {
          freeStandingFunction(this); // NOT allowed!
     }
};

最后,一个继承层次较低的非友元类看不到DerivedPrivateBaseClass继承,因此不能传递给freeStandingFunction


使用此矩阵(从此处获取)确定继承成员的可见性:

1
2
3
4
5
6
inheritance\member  |     private     |   protected   |   public
--------------------+-----------------+---------------+--------------
private             |  inaccessible   |    private    |  private
protected           |  inaccessible   |    protected  |  protected
public              |  inaccessible   |    protected  |  public
--------------------+-----------------+---------------+--------------

例1:

1
2
class A { protected: int a; }
class B : private A {};       // 'a' is private inside B

例2:

1
2
class A { public: int a; }
class B : protected A {};     // 'a' is protected inside B

例3:

1
2
class A { private: int a; }
class B : public A {};        // 'a' is inaccessible outside of A


我在这个问题中添加了一个非常详细的关于InheritanceAccess Specifiers的解释。它解释了所有类型的继承以及访问说明符如何与每个继承说明符一起工作。看一看。Hth:)


private只允许声明它的类访问它。protected允许类和派生/子类访问,就好像它是私有的一样。


基本上,protected继承比private继承更进一步地延伸到继承层次。详情请参阅C++ FAQ Lite。