考虑下面的代码:如何让基础班的私人成员成为儿童班的公共成员?
class Base
{
void f() { }
};
class Derived: public Base
{
public:
};
你可以在派生类中改变什么,这样你可以执行以下操作:在基类中如果该成员被声明
Derived d;
d.f();
为public,在派生类公共部分添加一个使用声明Base :: f可以解决问题。但是如果它在基类中被声明为私有的,这似乎不起作用。
考虑下面的代码:如何让基础班的私人成员成为儿童班的公共成员?
class Base
{
void f() { }
};
class Derived: public Base
{
public:
};
你可以在派生类中改变什么,这样你可以执行以下操作:在基类中如果该成员被声明
Derived d;
d.f();
为public,在派生类公共部分添加一个使用声明Base :: f可以解决问题。但是如果它在基类中被声明为私有的,这似乎不起作用。
这是不可能的。使用声明不能命名私有基类成员。即使有其他重载的函数具有相同的名称也不是私有的。
唯一的办法可能是使派生类的朋友:
class Derived;
class Base
{
void f() { }
friend class Derived;
};
class Derived: public Base
{
public:
using Base::f;
};
既然你公开在派生类反正这样派生的Derived
类将能够访问他们的名字,你可以做它们也是基类中的protected
,并且省略了friend
声明。
您无法从派生类访问私人成员。你可以做的是让它的保护,并使用using
声明:
class Base
{
protected:
void f() { }
};
class Derived: public Base
{
public:
using Base::f;
};
是的,我试过了,这个工程。 – jasonline 2010-03-28 15:56:20
我想补充一句,他应该认真思考他为什么要这样做; p – 2010-03-28 15:36:58
@Joseph:我只记得在面试中被问到这个问题,唯一允许的是修改派生类。我认为成为基础班的私人/公共成员无关紧要。但是我想如果这个成员是私人的,这是不可能的。 – jasonline 2010-03-28 15:58:35