2011-11-13 66 views
4

請注意,Derived類的構造函數具有ii作爲其第一個參數,但傳遞給Base的參數故意等於i爲什麼編譯器不會在Derived類構造函數的定義中抱怨?

class Base 
{ 
    protected: 
    int i; 

    public: 
    Base(int i) : i(i) {} 
}; 

class Derived : public Base 
{ 
    private: 
    int k; 

    public: 
    Derived(int ii, int k) : Base(i), k(k) {} // Why not C2065: 'i' undeclared identifier 
}; 

int main() 
{ 

} 
+2

當然編譯器在這裏有足夠的信息來知道代碼正在使用單位化變量。它並沒有抱怨,因爲開發團隊決定用他們的寶貴工時來開發其他東西,而不是這個(比如VS2010中的一些C++ 11支持)。 –

回答

7

i由於從Base繼承的成員變量,所以它是定義。您可以自由訪問初始化列表中的成員變量,但是您正在做的是在初始化之前訪問變量,也就是我相信的未定義行爲。

+0

你可以舉一個例子,這將是有效的? – Ayrosa

+0

@jaayrosa哪裏有效?初始化一個基礎成員?在這種情況下,如果'Base'沒有一個構造函數來初始化'i',你會想通過執行'Derived(int ii,int k)來初始化它:i(ii),k(k){ }'。然而,將未初始化的變量作爲參數傳遞是無效的。 –

+0

你的例子對我來說很清楚。我不明白爲什麼編譯器不會發出C2065,因爲傳遞給'Base'的變量與傳遞給'Derived'的變量不同。 – Ayrosa

3

因爲它從基類中看到i並在初始化器中使用它。如果您將保護更改爲私密,則您將收到有關Base::i爲私密的錯誤。

相關問題