1
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 のサイズはであり、 (1 つは基底クラス用、もう 1 つは派生クラス用) に8 byte割り当てられます。2 m1解決するメカニズムは何d.m1ですか?

4

2 に答える 2

6

m1inは'sの名前derを非表示にするため、オブジェクトを介してアクセスすると、そのインスタンスのが取得されます。次のようにアクセスできます。basem1m1derder::m1base::m1der

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

そして、このようにしてベースオブジェクトにアクセスできます。

der d;
d.base; // base object
std::cout << d.base::m1 >> "\n"; // access base object's m1 outside of der (if allowed)
于 2012-05-01T11:36:33.387 に答える
5

コンパイラはm1、の静的タイプに基づいて解決しdます。これは、次の場合に異なる結果が得られることを意味します

der d;
cout << d.m1;

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

これはm1、タイプの式を解決するときderに、メンバーder::m1がを非表示にするためbase::m1です。

于 2012-05-01T11:36:24.540 に答える