考慮下面的代碼:如何讓基礎班的私人成員成爲兒童班的公共成員?
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