C ++继承中受保护的成员变量和私有成员变量

rat*_*zip 6 c++ inheritance access-control

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

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

例如:

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

class Derived: public Base
{

};
Run Code Online (Sandbox Code Playgroud)

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

小智 11

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

声明一个与基类成员同名的成员“影子”了基类的成员。也就是说,派生类有自己的独立变量,该变量恰好与基类版本具有相同的名称。

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


the*_*ker 7

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

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

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


Ree*_*ril 7

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

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

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

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

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

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

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

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

有关更多说明,请参阅此链接:http : //www.tutorialspoint.com/cplusplus/cpp_inheritance.htm

  • 派生类始终继承基类的所有成员。不同的保护级别仅控制派生类可以访问的内容,而不控制继承的内容。 (2认同)

小智 6

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 
}; 
Run Code Online (Sandbox Code Playgroud)

下表总结了上述三种模式,并显示了在 public、protected 和 private 模式下派生时子类中基类成员的访问说明符:

https://i.stack.imgur.com/AIncv.jpg

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