我有A类和B类。 C 类派生自 B 类,并以 A 类对象作为组合。http://ideone.com/JGT48M http://ideone.com/JGT48M
#include "iostream"
using namespace std;
class A {
int i;
public:
A(int ii) : i(ii) {
cout << "\n Constructor of A is called \n";
}
~A() {
cout << "\n destructor of A is called \n";
}
void f() const {}
};
class B {
int i;
public:
B(int ii) : i(ii) {
cout << "\n Constructor of B is called \n";
}
~B() {
cout << "\n destructor of B is called \n";
}
void f() const {}
};
class C : public B {
A a;
public:
C(int ii) : a(ii), B(ii) {
cout << "\n Constructor of C is called \n";
}
~C() {
cout << "\n destructor of C is called \n";
} // Calls ~A() and ~B()
void f() const { // Redefinition
a.f();
B::f();
}
};
int main() {
C c(47);
} ///:~
我读过,构造函数的调用是基于它们在派生类构造函数中的调用方式。我的意思是让有一个名为 REF 的类派生自 REF_BASE1 和 REF_BASE2 然后
REF (int ii) : REF_BASE2(ii), REF_BASE1 (ii) {
意味着将首先调用 REF_BASE2,然后调用 REF_BASE1,然后调用 REF 构造函数。
如果我们将其定义为
REF (int ii) : REF_BASE1(ii), REF_BASE2 (ii) {
意味着将首先调用 REF_BASE1,然后调用 REF_BASE2,然后调用 REF 构造函数。
然而,在我上面的程序中,我明确“错误地”指出,通过内部组合变量 A 首先初始化,然后 B 应该初始化,但编译器以正确的方式执行此操作,但未能让我知道我的错误
无论我在派生类构造函数初始化列表中指定的顺序如何,上述程序的输出都是
Constructor of B is called
Constructor of A is called
Constructor of C is called
destructor of C is called
destructor of A is called
destructor of B is called
我的问题是
1)为什么编译器不抱怨?或者我是对的吗?
2)派生构造函数中的顺序是否没有严格遵循?