C ++:创建可以访问基类私有变量的派生类吗?

时间:2019-04-16 21:12:40

标签: c++

我有一个抽象类base,带有私有成员变量base_var。我想创建一个派生类,该派生类还具有base_var作为私有成员。

对我来说,这似乎是您想做的一件事。 base是抽象的,因此永远不会被实例化。我唯一会创建一个base对象的情况是,如果它实际上是一个派生对象,那么很显然,当我给‘base’一个私有成员变量时,我真正想做的就是将该变量赋给所有对象。它的派生对象。

但是,下图似乎表明这对继承是不可行的?

enter image description here

为什么不呢?那么在抽象类中包含私有内容又有什么意义呢?该类永远不会被实例化,所以所有私有的东西实际上是没有用的?

3 个答案:

答案 0 :(得分:1)

  

但是,下图似乎表明这对继承是不可行的?

正确的,派生类无法访问类的private成员。如果您希望某个类的成员可以被其派生类访问,而不能被外部访问,则必须将其设为protected

  

为什么不呢?那么在抽象类中包含私有内容又有什么意义呢?该类永远不会被实例化,所以所有私有的东西实际上是没有用的?

即使抽象类也可以具有作用于(private)成员变量的成员函数。考虑(有点愚蠢的例子,但是很好):

class MaxCached
{
  private:
  int cache = std::numeric_limits<int>::min();

  public:
  bool put(int value)
  {
    if (value > cache)
    {
      cache = value;
      return true;
    }
    return false;
  }

  int get() const
  {
    return cache;
  }

  virtual void someInterface() const = 0;
};

从此类派生而来,可以为您提供基类(putget)的功能,而又不会破坏基类(例如,将错误的值写入cache)。

旁注:以上是一个纯粹的示例!您不应该在抽象基类中添加这样的缓存(与您的接口无关)。就目前而言,该示例违反了“单一责任原则”!

答案 1 :(得分:1)

  

我有一个带有私有成员变量base_var的抽象类库

class foo { 
public:
    virtual void a_pure_virtual_method() = 0;                           
    int get_var() { base_var; }
    virtual ~foo(){}
private:
    int base_var;
};

请注意,如果一个类具有至少一个纯虚拟(又称为抽象)方法,则该类被称为抽象。没有什么可以禁止抽象类具有非纯虚拟甚至非虚拟方法的。

  

我想创建一个派生类,该派生类还具有base_var作为私有成员。

class derived : public foo {};
  

对我来说,这似乎是您想做的一件事。

当然,到目前为止没有问题。

  

我唯一创建基础对象的时间是它是否实际上是派生对象,因此很显然,当我给“ base”一个私有成员变量时,我真正想做的就是将该变量赋给它的所有变量。派生对象。

仍然可以。

  

为什么不呢?

您混淆了包含在映像中的访问权限,而仅包含派生成员中的成员。派生类无权访问基类中私有的成员。期。这只是根据私有的定义。

  

那么在抽象类中包含私有内容又有什么意义呢?该类永远不会被实例化,所以所有私有的东西实际上是没有用的?

这根本没有用。派生类继承所有成员,但是它们无法访问所有成员。那里有私人物品,您不能直接访问它。那就是封装的全部要点。考虑以下示例:

class bar : public foo {
    void test() {
        std::cout << base_var;  // error base_var is private in foo
        std::cout << get_var(); // fine
    }
};

答案 2 :(得分:1)

仅仅因为类是抽象的,并不意味着该类中无法实现可能访问该变量的代码。当您在类中声明一个项目为私有时,编译器会认为您有充分的理由,并且不会因为类中只有一个纯虚函数而更改访问权限。

如果您希望派生类有权访问基类成员,则将该成员声明为受保护的