クラス A と クラス B があります。クラス C はクラス B から派生し、クラス A オブジェクトを構成として持ちます。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_BASE1 と REF_BASE2 から派生した REF というクラスが存在するということです。
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) 派生コンストラクターの順序が厳密に守られていませんか?