-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::xMed1::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->x

于 2012-02-26T22:51:20.433 回答