【问题标题】:the protected and private member variables in C++ inheritanceC++ 继承中的受保护和私有成员变量
【发布时间】:2021-01-29 03:07:16
【问题描述】:

我是 C++ 的新手,我对继承中的 C++ 保护成员和私有成员有疑问。

如果一个类是公有的,继承了一个基类,受保护的和私有的成员变量是否会成为派生类的一部分?

例如:

class Base
{
   protected: 
       int a;
       int b;
   private:
       int c;
       int d;
   public;
       int q;
};

class Derived: public Base
{

};

Derived 类是否也有a, b, c, d, q 的所有成员?我们可以在 Derived 类中将 int a 定义为 public、protected 和 private 吗?

【问题讨论】:

标签: c++ inheritance access-control


【解决方案1】:

没有类可以访问private 变量。甚至没有子类。

只有子类可以访问protected 变量。

所有类都可以访问public变量。

【讨论】:

    【解决方案2】:

    基类的所有成员都是派生类的一部分。但是,派生类只能访问公共或受保护的成员。

    将同名的成员声明为基类的成员会“隐藏”基类的成员。也就是说,Derived 类有自己的自变量,恰好与基类版本同名。

    这是个人选择,但我发现使用变量在基类和派生类之间进行通信会导致代码更加混乱,因此我倾向于将成员变量设为私有或使用 PIMPL 模式。

    【讨论】:

      【解决方案3】:

      类的私有成员可以被继承,但不能被其派生类直接访问。可以使用基类的公共或受保护方法访问它们。

      继承模式指定派生类如何访问受保护和公共数据成员。

      如果派生类以私有模式继承基类,

      1. 基类的受保护成员是派生类的私有成员。
      2. 基类的公共数据成员是派生类的私有成员。

      如果派生类在protected模式下继承基类,

      1. 基类的受保护成员是派生类的受保护成员。
      2. 基类的公共数据成员是派生类的受保护成员。

      如果派生类在public模式下继承基类,

      1. 基类的受保护成员是派生类的受保护成员。
      2. 基类的公共数据成员是派生类的公共成员。

      请参阅此链接以获得更多说明: http://www.tutorialspoint.com/cplusplus/cpp_inheritance.htm

      【讨论】:

      • 派生类总是继承基类的所有成员。不同的保护级别只控制派生类可以访问的内容,而不是继承的内容。
      【解决方案4】:
      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 
      }; 
      

      下表总结了上述三种模式,并显示了在公共、保护和私有模式下派生时子类中基类成员的访问说明符:

      https://imgur.com/a/yaQjFOJ

      https://www.geeksforgeeks.org/inheritance-in-c/

      【讨论】:

        【解决方案5】:

        没有派生类可以访问其私有基类的属性或方法。它只能访问公共或受保护的。即使 settergetter defined 在 基类,访问基类成员时仍然会出错。

        【讨论】:

          【解决方案6】:
          class A{
          protected:
              int a {9723999};
          };
          
          
          class B:public A{
          public:
              B(){
                  cout<<a<<endl;
              }
          
          };
          
          int main()
          {
              B b;
              return 0;
          }
          

          子类不能访问父类的私有成员

          【讨论】:

            猜你喜欢
            • 2023-03-03
            • 2016-06-12
            • 2014-06-09
            • 1970-01-01
            • 2012-09-12
            • 2014-06-29
            • 2018-10-27
            • 1970-01-01
            • 2010-10-26
            相关资源
            最近更新 更多