2012-05-01 9 views
0
Look at this example 

class base { 
public: 
    int m1; 
    base() { 
     m1 = 5; 
    } 
}; 

class der: public base { 
public: 
    int m1; 
    der() { 
     m1 = 6; 
    } 
}; 

int main() { 
    der d; 
    cout << d.m1; 
    return 0; 
} 

ここでオブジェクトdのサイズは2 m1(1つはベースクラス、もう1つは派生クラス)に割り当てられた8 byteです。 d.m1を解決するメカニズムは何ですか?基本クラスと派生クラスの両方に同じメンバ変数がある場合、コンパイラがどのメンバを呼び出すかを解決する方法は?

答えて

5

derm1はそうderオブジェクトを経由してm1へのアクセスは、あなたにそのインスタンスのder::m1を取得し、basem1の名前を隠します。

class der: public base { 
public: 
    int m1; 
    der() { 
     m1 = 6; 
     base::m1=7; // access base object's m1 inside der 
    } 
}; 

そして、あなたは、このようにベースオブジェクトにアクセスすることができます:あなたはこのよう derbase::m1にアクセスすることができ

der d; 
d.base; // base object 
std::cout <<d.base::m1>> "\n"; // access base object's m1 outside of der (if allowed) 
4

コンパイラは、dの静的型に基づいてm1を解決します。これは、あなたがタイプderの発現にm1を解決するときに、メンバーder::m1base::m1を隠すためです

der d; 
cout << d.m1; 

der d; 
base &b = d; 
cout << b.m1; 

に異なる結果を得ることを意味します。

+2

そして、あなたはおそらく、これを行うべきではありません。 –

関連する問題