2012-06-14 49 views
0
class X { 

    int i; 

public: 

    X() { i = 0; } 

    void set(int ii) { i = ii; } 

    int read() const { return i; } 

    int permute() { return i = i * 47; } 
}; 

上面繼承的類X重載在C++

另一類Y的定義是有作爲

class Y : public X { 

    int i; // Different from X's i 

public: 

    Y() { i = 0; } 

    int change() { 
     i = permute(); // Different name call 
     return i; 
    } 

    void set(int ii) { 
     i = ii; 
     X::set(ii); // Same-name function call 
    } 
}; 

我的疑問是,X類還包括一個名爲變量i和它被Y類繼承,但Y類的i應覆蓋它,但類(Y)的大小即將到來8.

其次,對於行

X::set(ii) 

我們可以這樣調用該函數? 是否爲任何對象調用了類X的此函數?提前

+0

請縮進您的代碼!縮進使得它更具可讀性。 – tmpearce

回答

5

Y::i沒有覆蓋任何東西(你只能覆蓋一個虛函數)。它隱藏X::i,所以有兩個不同i S,一個在基類和一個在派生。

你的第二個問題,你只能使用類似語法X::set(ii);setstatic成員函數,而不是一個正常或virtual成員函數的類之外。在類內部,你可以使用它來強制要使用的成員函數的特定類的定義。

編輯:我應該回答棘手的(有點相關的)問題:如果靜態類型與動態類型不同,那麼使用哪個i?例如,讓我們考慮一個簡化版本:

class base { 
protected: // we'll make `i` protected, so `derived` can access it if necessary. 
    int i; 
public: 
    base() : i(0) {} 
    void hide() { i = 2; } 
    virtual void set() { i = 10; } 
}; 

class derived : public base { 
    int i; 
public: 
    derived() : i(0) {} 
    void hide() { i = 1; } 
    void set() { i = 5; } 
}; 

現在,由於set是虛擬的,在main調用的是derived::set。由於hide不是虛擬的,因此main中的呼叫將爲base::hide()。問題是,他們每個人將分配給哪一類'i

答案很簡單:即使函數是虛擬的,變量也不是,所以每個函數都引用自己類中的變量。有/沒有virtual控制您調用哪個函數,但不控制該函數引用哪個變量。

+1

最後一次調用相當於'this-> X :: set(ii)'這是有效的。 –

+0

@ K-ballo:是的,正在編輯,因爲你評論。 –

4

很多很多的感謝請注意,在你的代碼中沒有壓倒一切,唯一的名字躲在

我的疑問是,X類還包括一個名爲Y類的我,它是由Y類繼承,但我應該覆蓋它的變量,但類(Y)的尺寸來了8

繼承不會覆蓋變量。在YiX類隱藏名字i,但雙方會存在的因此大小。

X :: set(ii) 我們可以調用這樣的函數嗎?是否爲任何對象調用了此類的函數?

Y類中,這合格的通話請求從Xset以靜態方式,而不是Yset被調用。

+0

你能否更詳細地說明這是什麼意思,從靜態方式調用X? – Luv

+1

@Luv:表示分辨率爲_static_。如果'set'設置了'virtual'函數,那麼調用將從'X'調用它的定義,而不是任何其他'overriding'版本。 –

+0

感謝您的解釋 – Luv