您可以通过继承“提升”访问规范,是否可以“降级”访问规范?

时间:2011-07-29 01:56:02

标签: c++ inheritance

通过'促销',我的意思是使访问更具限制性,并且通过'降级',我的意思是减少限制。

例如,当class B使用class A: protected: private派生时,A的公共成员将分别升级为受保护和私有。

某些class C是否可以从class B进入并从中获取,同时将A类的继承成员降级为原始访问规范?

4 个答案:

答案 0 :(得分:6)

如果您正在使用protected派生,那么类C确实可以通过创建适当的包装器来访问受保护的成员:

class A {
public:
  void F();
};

class B : protected A { };

class C : public B {
public:
  using B::F;
};

这也可以用于数据成员:

class A {
public:
  int n;
};

class B : protected A { };

class C : public B {
public:
  using B::n;
  C() : n(this->B::n) { }
};

使用private继承,这是不可能的,因为C本身无法访问A中的成员。但是,如果B来自A使用private virtual继承,再次成为可能:

class A {
public:
  void F();
};

class B : private virtual A { };

class C : public B, public virtual A { };

int main() {
  C x;
  x.F();
  return 0;
}

这是有效的,因为virtual继承C可以直接从A的{​​em>同一个实例派生为B,但有不同的访问说明符。

答案 1 :(得分:3)

using声明可以访问受保护基类的公共成员或受保护成员:

struct A {int x;};
struct B : protected A {};

struct C : B
{
    using A::x;  // publicly accessible
}

显然,C无法使用私有成员和基类,因此您无法减少对它们的限制。

答案 2 :(得分:0)

当然不是,如果我可以创建另一个派生那个吹掉中间类'访问限制并使所有内容{{1}的类的派生,那么拥有privateprotected继承会有什么意义呢? }}?

答案 3 :(得分:0)

即可。 因为,当class C派生class B时;它不知道class A的原始访问说明符。它只是尊重class B中的访问说明符。