-1

次のクラスがあります。

class Base
{
public:
    Base() { x = 3; }
    int x;
    virtual void foo() {};
};

class Med1 : public virtual Base
{
public:
    int x;
    Med1() { x = 4; }
    virtual void foo() {};
};

class Med2 : public virtual Base
{
public:
    virtual void goo() {};
    virtual void foo() {};
};

class Der : public Med1, public Med2
{
public:
    Der() {}
    virtual void foo() {};
    virtual void goo() {};
};

そして、次のコード:

Base* d = new Der;
d->foo();
cout << d->x;

出力:

 3

何故ですか?Med1コンストラクターは、コンストラクターの後に呼び出さBaseれます。私はそれが設定Med1::xであると推測していますBase::xが、なぜDer::x同じでBase::xあり、そうでないのですかMed1::x。なぜあいまいさがないのですか?

4

3 に答える 3

1

dは へのポインタBaseであるため、d->x明確に を参照しBase::xます。へのポインターである場合にのみ、あいまいさが生じますDer

于 2012-02-26T22:54:41.563 に答える
0

Base へのポインタであるため、x は Base になります。そして、コンストラクターの順序は、スーパークラス、派生クラスの順です。そのため、Base クラスのコンストラクターが最初に呼び出され、次に Der のコンストラクターが呼び出されます。

于 2012-02-26T23:17:52.753 に答える
-1

変数xは仮想ではないので、コンパイラーは頭をかいて、「Baseにハングアップする」と言う必要があります。したがって、Base->x

于 2012-02-26T22:51:20.433 に答える