C++ 是否可以继承私有类但将成员公开?
我想让成员继承私人财产。我想我看到了一个公开的例子,但是这个事实是由private关键字派生的。我的问题是:如何做到这一点,如果可能的话,难道不应该禁止吗C++ 是否可以继承私有类但将成员公开?,c++,inheritance,C++,Inheritance,我想让成员继承私人财产。我想我看到了一个公开的例子,但是这个事实是由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的私有对象,并且不能
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
成员)
但是,受保护的
和公共
成员的情况并非如此,它们的访问级别可以通过使用
声明被派生类覆盖。例如:
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
}
怎么做
尽可能使用using
关键字
难道不应该禁止吗
class U{
public:
int a;
protected:
int b;
private:
int c;
};
class V : private U{
public:
int i;
//can make a public again?
};
没必要。您始终可以将成员返回其可访问性,但返回的次数不能超过最初的次数。所以,如果基类最初将某个东西声明为public,并且只是您的想法/限制将其私有化,那么如果您放弃此限制并将其保留为public,这不会损害基类,总之,它在一开始是public的。这里引用“C++编程语言”将最有帮助
不能使用using声明来访问附加的
信息。这仅仅是一种使人易于接近的机制
更方便使用的信息
所以,如果它在基类中是可访问的,并且您使用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;
}
您不能将
U::c
设置为公共,因为它是U
到U
的私有对象,因此无法从V
访问它。如果它是公共的
或受保护的
,那么您可以使用声明。因此,您可以将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
};
不是真的。OP询问的是私有数据成员。OP询问的是U::c
,它在U
@KoKuToru中是私有的,这不是问题最初所说的,这就是为什么会有一些混乱的原因。@authority:哦,好吧。嗯,答案仍然有效:)