2011-11-13 6 views
4

Derivedクラスコンストラクターは、最初の引数としてiiを持ちますが、Baseに渡された引数は、目的に応じてiに等しくなっています。コンパイラが派生クラスのコンストラクタの定義に不満を持っていないのはなぜですか?

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

確かに、コンパイラは、コードがunitialised変数を使用している知るためにここに十分な情報を持っています。これは、開発チームが貴重な工数を使ってこれ以外のものを開発することにしたためです(VS2010のC++ 11サポートのように)。 –

答えて

7

iのでBaseから継承されたメンバ変数であるので、が定義あります。初期化子リストのメンバ変数に自由にアクセスすることができますが、初期化する前に変数にアクセスすることができます。これは未定義の動作です。

+0

これが有効な例を教えてください。 – Ayrosa

+0

@jaayrosaどこが有効でしょうか?ベースメンバーを初期化しますか?この場合、 'Base'に' i'を初期化するコンストラクタがない場合は、 'Derived(int ii、int k):i(ii)、k(k){ } '。ただし、初期化されていない変数を引数として渡すことは決して有効ではありません。 –

+0

あなたの例はかなりわかりやすいです。私が理解できないのは、 'Base'に渡される変数が' Derived'に渡される変数と異なるため、コンパイラがC2065を発行しない理由です。 – Ayrosa

3

それは基本クラスからiを見て、初期化子でそれを使用しているため。保護されたプライベートに変更すると、Base::iがプライベートであるというエラーが表示されます。

関連する問題