我希望成员继承私有。我想我看到了一个将它们公之于众的例子,然而这个事实是由私人关键字衍生出来的。我的问题:怎么做,如果有可能,那么不应该被禁止吗?
class U{
public:
int a;
protected:
int b;
private:
int c;
};
class V : private U{
public:
int i;
//can make a public again?
};
答案 0 :(得分:6)
您无法公开c
因为U
是私有的,而且无法从V
访问(此外,需要的设计可能存在缺陷,因为它会违反封装 - 一个类不应该知道/关心其他类的private
成员。
但是,protected
和public
成员的情况也是如此,其访问级别可以通过using
声明被派生类覆盖。例如:
class V : private U{
public:
int i;
using U::a;
// ^^^^^^^^^^^ Gives "a" public accessibility
using U::b;
// ^^^^^^^^^^^ Gives "b" public accessibility
// using U::c; // ERROR! c is not accessible from V
};
上述内容可以b
从V
和U
外部的客户端代码访问:
int main()
{
V v;
v.a = 42; // OK
v.b = 1729; // OK
}
答案 1 :(得分:5)
怎么做?
完全可能,请使用using
关键字。
不应该被禁止吗?
没有必要。您可以随时向返回成员返回其可访问性,但不超过最初的。所以,如果基类最初声明了一些公共内容,并且只是你的想法/限制使它成为私有的,如果你放弃这个限制并将其保留为公共,这不会损害基类,总而言之它是公开的一开始。引用“C ++编程语言”将有助于此。
使用声明不能用于访问附加 信息。它只是使可访问性的机制 信息使用更方便。
因此,如果它可以在基类中访问,并且您使用protected
或private
关键字派生了类,则可以删除此限制并通过“传输”它们将其返回到初始访问级别派生类定义中的适当部分(public,protected,private
)。
class U{
public:
int a;
protected:
int b;
private:
int c;
};
class V : private U{
public:
using U::b;
using U::a;
};
int main(int argc, char** argv) {
V v;
printf("\nV: %d %d %d",v.a,v.a,v.b);
U u;
printf("\nU: %d %d %d",u.a,u.a,u.a);
return 0;
}
答案 2 :(得分:3)
您无法公开U::c
,因为它是private
到U
,因此无法从V
访问它。如果是public
或protected
,那么您可以使用using
声明。因此,您可以公开U::a
和U::b
,但不能公开U::c
:
class V : private U{
public:
int i;
//can make c public again?
using U::c; // ERROR: only if U::c is public or protected in U
using U::a; // OK
using U::b; // OK
};