#include <fstream>
using namespace std;
ofstream out("order.out");
#define CLASS(ID) class ID { \
public: \
ID(int) { out << #ID " constructor\n"; } \
~ID() { out << #ID " destructor\n"; } \
};
CLASS(Base1);
CLASS(Member1);
CLASS(Member2);
CLASS(Member3);
CLASS(Member4);
class Derived1 : public Base1 {
Member1 m1;
Member2 m2;
public:
Derived1(int) : m2(1), m1(2), Base1(3) {
out << "Derived1 constructor\n";
}
~Derived1() {
out << "Derived1 destructor\n";
}
};
class Derived2 : public Derived1 {
Member3 m3;
Member4 m4;
public:
Derived2() : m3(1), Derived1(2), m4(3) {
out << "Derived2 constructor\n";
}
~Derived2() {
out << "Derived2 destructor\n";
}
};
int main() {
Derived2 d2;
}
「 コンストラクタは、デフォルトコンストラクタではないことに注意してください。彼らは、それぞれのint 引数を持つ引数自体は何の識別子を持っていません;。 存在のその唯一の理由は明示的にコンストラクタを呼び出すことを強制することです 初期化子リスト」Bruce Eckelの「Thinking in C++」の次のコメント(太字)は、そのページ624 Vol。 1
-1を提供していないので、この一方
は、ないでしょう:質問が不十分記載されています。テキストの文章が本(私がそうであると仮定して)またはあなたからのものかどうかは明確ではありません。あなたは本からの一節といくつかのコードを引用して、それを質問とすべきではありません。 –
なぜコンストラクタのint引数が存在すると、イニシャライザリストで強制的に呼び出しが行われるのでしょうか? – Belloc
このコードは本から直接得られたものではないことを教えてください! 'ID'のデストラクタは' virtual'でなければならず、イニシャライザのリストは '' Base1(3)、m1(2)、m2(1) 'のように順序づけるべきです。 – Johnsyweb