2010-01-06 141 views
8

我知道派生類無法訪問基類的私有成員,那爲什麼派生類繼承基類的私有成員呢?有沒有什麼情況下它是有用的?爲什麼派生類繼承基類的私有成員?

謝謝!

+10

你正在學習C++的書不得不在這個問題上說些什麼? – 2010-01-06 21:35:30

回答

20

派生類需要私有成員,即使它不能直接訪問它們。否則,行爲不會建立在它所源自的類上。

例如,假裝的私人東西是:

int i; 

和類具有GETI()和SETI()。我的價值必須放在某個地方,即使它是私人的,

+0

主席先生我承認,很少遇到這樣一個優雅和真棒的答案。謝謝你,先生,這個答案,特別是最後一行:)) – 2016-03-04 22:42:04

0

派生類不以任何方式「繼承」基類的私有成員 - 它無法訪問它們,因此它不會「繼承」它們。

由於顯而易見的原因,派生類的實例包含基類的私有成員的實例。

所以我甚至不知道你的意思是這個問題。

+2

「派生類不會」繼承「基類的私有成員」是的,除非您試圖分割語法頭髮。 – 2010-01-06 22:14:50

+1

我認爲通過「繼承」他的意思是「可以訪問」 - 這是對問題最無意義的解釋。 – 2010-01-07 01:11:07

2

原因是派生類與超類具有is-a關係。

派生類實例化是一個超類實例...只是更多(或更少的由於設置一些超類函數私人)的東西。

+2

非常令人困惑的新人OOP – Jaywalker 2010-01-07 05:46:18

+0

@Jaywalker我不明白它是如何令人困惑。無論派生類是否允許派生類直接使用它們,派生類_is-a_ base類及其基本組件仍需要能夠訪問其方法中的_its_「private」變量。 – 2017-11-19 20:43:24

10

基類的public和protected方法仍然可以訪問基類的private變量,並且這些方法在派生類中可用。

4

基類仍然可以使用私有成員變量&方法。

如果您希望派生類可以訪問成員,但不讓外部世界隱藏這些成員,請將它們設爲protected:

下面是一個例子來說明:

class Base 
{ 
public: 
    Base() : val(42.0f) {}; 
    float GetValue() const 
    { 
    return val_; 
    } 
private: 
    float val_; 
}; 

class Derived : public Base 
{ 
public: 
    float ComputedValue() const 
    { 
    return GetValue() * 2.0f; 
    } 
}; 
4

不要忘了基類可能具有不private方法,從而由派生類訪問。那些protectedpublic基類方法仍然可以調用private基類方法。如果要鎖定核心功能在基類中,如用Template Method設計模式實現這一點特別有用:

class base 
{ 
public: 

    virtual ~base() { /* ... */ } 

    virtual void base_func() { foo_private(); } 
    virtual void do_func() = 0; 

private: 

    void foo_private() 
    { 
    // pre-do_func() operations 

    do_func(); 

    // post-do_function operations 
    } 

}; 

class derived : public base 
{ 
public: 

    void derived_func() { base_func(); } 

    virtual void do_func() 
    { 
    // Derived class specific operations 
    } 
}; 
2

正如其他的答案在這裏被列出,派生類語法無法訪問基類的私人成員;但它需要在其內存佈局中具有相同的副本。考慮鑄造。使用'C'角色,你可以派生派生到私人基地。然後,編譯器需要正確的內存偏移量,以便爲基礎對象生成有效的內存佈局。

Ex。

class Base { 
public: 
    void printA() { 
    a = 10; 
    std::cout << a << std::endl; 
    } 
private: 
    int a; 
}; 
class Derived : private Base{ 
    int b; 
}; 

Derived* d = new Derived; 
Base* b = (Base*)d; 
b->printA(); 
0

當派生類對象被創建時,基類構造函數也被稱爲創建基類對象。如果基類的私有成員未分配內存,則基礎對象將不完整。

因此,派生類對象會繼承基類的私有成員,因爲它們是在創建基類對象期間創建的,但由於它們是私有對象而無法訪問。

0

雖然私有成員不能從基類訪問,但它們被它們繼承,因爲這些屬性是由非私有函數幫助的派生類使用的。

基類的私有成員不是直接訪問的,而是由派生類的基類派生的。

相關問題