我有以下课程:
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
。为什么没有歧义?
答案 0 :(得分:1)
d
是指向Base
的指针,因此d->x
明确指向Base::x
。如果它是指向Der
的指针,则只会有歧义。
答案 1 :(得分:0)
因为它是指向Base x的指针将是Base。 并且构造函数的顺序是超类,然后是派生类。因此首先调用Base类的构造函数,然后调用Der。
答案 2 :(得分:-1)
变量x
不是虚拟的,因此编译器必须抓住它的头并说 - 挂在你的Base上。因此它转到Base->x