C++ 中的受保护派生和私有派生有什么区别

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

本文关键字:派生 什么 区别 受保护 C++      更新时间:2023-10-16

可能的重复项:
C++中私人、公共和受保护继承的区别

在 c++ 中派生为受保护或私有有什么区别? 我无法弄清楚,因为两者都似乎限制了从派生类对象访问基类成员

让我们考虑一个代码示例,该示例显示了使用不同级别的继承允许(或不允许)的内容:

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

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

 void freeStandingFunctionUsingDerivedProtected()
 {
     DerivedProtected nonFriendOfProtected;
     freeStandingFunction(&nonFriendOfProtected); // NOT Allowed!
 }

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

 class DerivedFromDerivedProtected : public DerivedProtected
 {
     DerivedFromDerivedProtected()
     {
         freeStandingFunction(this); // Allowed
     }
 };

DerivedProtected派生的类可以说它继承自BaseClass,所以可以将自身传递给freeStandingFunction

 class DerivedPrivate : private BaseClass
 {
      DerivedPrivate()
      {
          freeStandingFunction(this); // Allowed
      }
 };

DerivedPrivate类本身知道它派生自BaseClass,所以可以把自己传递给freeStandingFunction

class DerivedFromDerivedPrivate : public DerivedPrivate
{
     DerivedFromDerivedPrivate()
     {
          freeStandingFunction(this); // NOT allowed!
     }
};

最后,继承层次结构中更下方的非友元类看不到DerivedPrivateBaseClass继承,因此无法将自身传递给freeStandingFunction

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

继承\成员 |    私人 |  受保护 |  公共--------------------+-----------------+---------------+--------------私人 | 无法访问 |   私人 | 私人受保护 | 无法访问 |   受保护 | 保护公共 | 无法访问 |   受保护 | 公共--------------------+-----------------+---------------+--------------

示例 1:

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

示例 2:

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

例3:

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

>private只允许声明它的类访问它 protected允许该类和派生/子类像私有类一样访问

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

基本上,protected继承比继承private继承更向下延伸。有关详细信息,请参阅 C++ 常见问题精简版。