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

17

我是C++的新手,关于继承中的protected和private成员变量,我有一个疑问。

如果一个类公开继承了一个基类,那么派生类中的受保护和私有成员变量是否会包含在内?

例如:

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 定义为公有的、受保护的和私有的吗?


可能是私有继承、公有继承和保护继承之间的区别的重复问题。 - sonicwave
3
publicprotectedprivate 关键字用于控制成员变量的访问权限。继承的成员变量存在于派生类实例中,即使实例本身无法通过名称访问这些成员变量。 - molbdnilo
6个回答

19

没有任何类可以访问私有变量,甚至连子类也不行。

只有子类可以访问受保护的变量。

所有类都可以访问公共变量。


13

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

声明与 Base 类中成员同名的成员会“遮蔽”Base 类的成员。也就是说,派生类有自己独立的变量,其名称恰好与基类版本相同。

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


8
一个类的私有成员可以被继承,但是不能直接被派生类访问。它们可以通过基类的公共或保护方法进行访问。
继承模式指定了派生类如何访问受保护和公共数据成员。
如果派生类以私有模式继承基类,则:
1. 基类的受保护成员是派生类的私有成员。 2. 基类的公共数据成员是派生类的私有成员。
如果派生类以受保护模式继承基类,则:
1. 基类的受保护成员是派生类的受保护成员。 2. 基类的公共数据成员是派生类的受保护成员。
如果派生类以公共模式继承基类,则:
1. 基类的受保护成员是派生类的受保护成员。 2. 基类的公共数据成员是派生类的公共成员。
更多信息请参考此链接:http://www.tutorialspoint.com/cplusplus/cpp_inheritance.htm

2
派生类始终继承基类的所有成员。不同的保护级别仅控制派生类可以访问什么,而不是继承的内容。 - DaveB

5
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/


0

任何派生类都无法访问其私有基类的属性或方法。它只能访问公共或受保护的属性或方法。即使在基类中定义了setter和getter,仍然会出现访问基类成员的错误。


0
class A{
protected:
    int a {9723999};
};


class B:public A{
public:
    B(){
        cout<<a<<endl;
    }

};

int main()
{
    B b;
    return 0;
}

子类无法访问父类的私有成员


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接