虚拟继承和同名成员

Virtual inheritance and same name members

提问人:Luchian Grigore 提问时间:2/27/2012 更新时间:2/27/2012 访问量:104

问:

我有以下课程:

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

为什么? constructor 在 constructor 之后调用。我猜它是设置,而不是,但为什么与 和 not 相同。为什么没有歧义?Med1BaseMed1::xBase::xDer::xBase::xMed1::x

C++ 虚拟继承

评论


答:

-1赞 Ed Heal 2/27/2012 #1

该变量不是虚拟的,因此编译器必须挠头说 - 挂在你的基础上。因此,它转到xBase->x

评论

0赞 curiousguy 8/5/2012
当然,在 C++ 中,数据成员不能是虚拟的。(我猜反对票是关于这个答案暗示变量可以是虚拟的......关键是不会覆盖,因为只有虚拟函数声明才能覆盖其他虚拟函数声明。Med1::xBase::x
1赞 Mike Seymour 2/27/2012 #2

d是指向 的指针,因此明确地指向 。只有当它是指向 的指针时,才会有歧义。Based->xBase::xDer

评论

0赞 Luchian Grigore 2/27/2012
医 管 局!有道理,不知道我为什么错过了。但是我更改了代码,仍然没有歧义。如果我有指向 的指针,它会打印。猜猜隐藏.4DerMed1Base::x
0赞 NinjaCoder 2/27/2012 #3

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

评论

0赞 Luchian Grigore 2/27/2012
答案的第一部分与迈克的相同。我在问题中已经说过的第二部分......

上一个:包装器设计模式

下一个:转发声明一切