虚拟继承和同名成员

时间:2012-02-26 22:47:09

标签: c++ virtual-inheritance

我有以下课程:

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::xBase::x相同而不是Med1::x。为什么没有歧义?

3 个答案:

答案 0 :(得分:1)

d是指向Base的指针,因此d->x明确指向Base::x。如果它是指向Der的指针,则只会有歧义。

答案 1 :(得分:0)

因为它是指向Base x的指针将是Base。 并且构造函数的顺序是超类,然后是派生类。因此首先调用Base类的构造函数,然后调用Der。

答案 2 :(得分:-1)

变量x不是虚拟的,因此编译器必须抓住它的头并说 - 挂在你的Base上。因此它转到Base->x