提问人:Luchian Grigore 提问时间:2/27/2012 更新时间:2/27/2012 访问量:104
虚拟继承和同名成员
Virtual inheritance and same name members
问:
我有以下课程:
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 相同。为什么没有歧义?Med1
Base
Med1::x
Base::x
Der::x
Base::x
Med1::x
答:
-1赞
Ed Heal
2/27/2012
#1
该变量不是虚拟的,因此编译器必须挠头说 - 挂在你的基础上。因此,它转到x
Base->x
评论
0赞
curiousguy
8/5/2012
当然,在 C++ 中,数据成员不能是虚拟的。(我猜反对票是关于这个答案暗示变量可以是虚拟的......关键是不会覆盖,因为只有虚拟函数声明才能覆盖其他虚拟函数声明。Med1::x
Base::x
1赞
Mike Seymour
2/27/2012
#2
d
是指向 的指针,因此明确地指向 。只有当它是指向 的指针时,才会有歧义。Base
d->x
Base::x
Der
评论
0赞
Luchian Grigore
2/27/2012
医 管 局!有道理,不知道我为什么错过了。但是我更改了代码,仍然没有歧义。如果我有指向 的指针,它会打印。猜猜隐藏.4
Der
Med1
Base::x
0赞
NinjaCoder
2/27/2012
#3
由于它是指向基数的指针,因此 x 将是基数。 构造函数的顺序是超类,然后是派生类。因此,首先调用 Base 类的构造函数,然后调用 Der。
评论
0赞
Luchian Grigore
2/27/2012
答案的第一部分与迈克的相同。我在问题中已经说过的第二部分......
评论