我想让成员继承私有。我想我看到了一个将它们公开的例子,但是这个事实是用 private 关键字派生的。我的问题:怎么做,如果可能的话,不应该禁止吗?
class U{
public:
int a;
protected:
int b;
private:
int c;
};
class V : private U{
public:
int i;
//can make a public again?
};
我想让成员继承私有。我想我看到了一个将它们公开的例子,但是这个事实是用 private 关键字派生的。我的问题:怎么做,如果可能的话,不应该禁止吗?
class U{
public:
int a;
protected:
int b;
private:
int c;
};
class V : private U{
public:
int i;
//can make a public again?
};
您不能c
公开,因为它是私有的U
并且无法从其访问V
(此外,需要这样做的设计可能存在缺陷,因为它会违反封装 - 一个类不应该知道/关心private
其他类的成员)。
protected
但是, andpublic
成员却不是这样,派生类可以通过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
and外部的客户端代码访问U
:
int main()
{
V v;
v.a = 42; // OK
v.b = 1729; // OK
}
怎么做?
完全可能,使用using
关键字。
不应该禁止吗?
没必要。您始终可以将成员的可访问性返回,但不能超过最初的访问权限。因此,如果基类最初已将某些内容声明为公开,并且将其设为私有只是您的想法/限制,那么如果您放弃此限制并将其保留为公开,这不会损害基类,总而言之,它是公开的开始。引用“C++ 编程语言”将在这里得到最好的帮助。
using-declaration 不能用于访问附加 信息。它只是一种使可访问信息更方便使用的机制。
因此,如果它可以在基类中访问,并且您使用protected
or关键字派生了您的类,则可以删除此限制并通过将它们“传输”到派生类定义中的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;
}
你不能U::c
公开,因为它是private
给 的U
,所以它不能从V
. 如果是public
or 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
};