【发布时间】:2014-09-15 16:02:54
【问题描述】:
我读到在虚拟继承中,构造函数被称为“来自最派生的”。 考虑以下代码。在我看来,这里派生最多的类是 D。然后是 B 和 C,“最不派生的”是 A。 那么为什么最“基本”的构造函数首先被调用而不是“最衍生的”呢? 谢谢。
#include <iostream>
using namespace std;
struct A
{
A()
{
cout << "A default constructor" << endl;
}
};
struct B : virtual public A
{
B() : A()
{
cout << "B default constructor" << endl;
}
};
struct C : virtual public A
{
C() : A()
{
cout << "C default constructor" << endl;
}
};
struct D : public B, public C
{
D() : B(), C()
{
cout << "D default constructor" << endl;
}
};
int main()
{
D d;
}
这是输出:
A default constructor
B default constructor
C default constructor
D default constructor
更新:
好的。所以考虑下面的代码。 请注意,尽管 D、B 和 C 构造函数发送了 7,但仍打印了 10。 这里实际上基类 IS 是第一个被调用的。 没有从 D 到 B 到 A 的链条。 A() 首先被调用(实际上它是默认构造函数)。然后才调用 B 和 C 构造函数。
但我读到:“从最衍生。” 来源:c++ virtual inheritance
这里派生最多的是 D,然后是 B 和 C,然后是 A。那么为什么不考虑参数 B、D、C 从它们的构造函数传递给它的情况下首先调用 A 呢? 谢谢。
代码:
#include <iostream>
using namespace std;
struct A
{
int _x;
A()
{
_x = 10;
cout << "A default constructor" << endl;
}
A(int x)
{
_x = x;
cout << "A NOT-default constructor" << endl;
}
};
struct B : virtual public A
{
B(int x=7) : A(x)
{
cout << "B constructor" << endl;
}
};
struct C : virtual public A
{
C(int x=7) : A(x)
{
cout << "C constructor" << endl;
}
};
struct D : public B, public C
{
D(int x=7) : B(x), C(x)
{
cout << "D constructor" << endl;
}
};
int main()
{
D d;
cout << d._x;
}
输出:
A default constructor
B constructor
C constructor
D constructor
10
【问题讨论】:
-
你在哪里读到的?如果构造函数是按从多到少的顺序调用的,那么任何构造函数都不能引用基类中的任何内容,因为实例的基础部分还没有被构造!您收到的输出是正确的。
-
最派生的构造函数首先按源文件顺序初始化虚拟基类。困难在哪里?
-
问题是你在构造函数的末尾输出。首先调用派生构造函数,但它调用父构造函数然后您的输出。
-
直接回答您的问题:最派生的构造函数 is 被首先调用,但在它执行第一行代码之前,它还调用基类构造函数。这就是为什么它不首先打印
"D constructor"。
标签: c++ inheritance virtual-inheritance