2010-03-28 43 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