2010-03-28 26 views
2

考虑下面的代码:如何让基础班的私人成员成为儿童班的公共成员?


class Base 
{ 
    void f() { } 
}; 

class Derived: public Base 
{ 
public: 

}; 

你可以在派生类中改变什么,这样你可以执行以下操作:在基类中如果该成员被声明


Derived d; 
d.f(); 

为public,在派生类公共部分添加一个使用声明Base :: f可以解决问题。但是如果它在基类中被声明为私有的,这似乎不起作用。

回答

5

这是不可能的。使用声明不能命名私有基类成员。即使有其他重载的函数具有相同的名称也不是私有的。

唯一的办法可能是使派生类的朋友:

class Derived; 

class Base 
{ 
    void f() { } 
    friend class Derived; 
}; 

class Derived: public Base 
{ 
public: 
    using Base::f; 
}; 

既然你公开在派生类反正这样派生的Derived类将能够访问他们的名字,你可以做它们也是基类中的protected,并且省略了friend声明。

+0

我想补充一句,他应该认真思考他为什么要这样做; p – 2010-03-28 15:36:58

+0

@Joseph:我只记得在面试中被问到这个问题,唯一允许的是修改派生类。我认为成为基础班的私人/公共成员无关紧要。但是我想如果这个成员是私人的,这是不可能的。 – jasonline 2010-03-28 15:58:35

1

您无法从派生类访问私人成员。你可以做的是让它的保护,并使用using声明:

class Base 
{ 
protected: 
    void f() { } 
}; 

class Derived: public Base 
{ 
public: 
    using Base::f; 
}; 
+0

是的,我试过了,这个工程。 – jasonline 2010-03-28 15:56:20