通过'促销',我的意思是使访问更具限制性,并且通过'降级',我的意思是减少限制。
例如,当class B
使用class A
或: protected
从: private
派生时,A的公共成员将分别升级为受保护和私有。
某些class C
是否可以从class B
进入并从中获取,同时将A类的继承成员降级为原始访问规范?
答案 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}的类的派生,那么拥有private
或protected
继承会有什么意义呢? }}?
答案 3 :(得分:0)
否即可。
因为,当class C
派生class B
时;它不知道class A
的原始访问说明符。它只是尊重class B
中的访问说明符。