C++相談室 part77
■ このスレッドは過去ログ倉庫に格納されています
0700デフォルトの名無しさん
2010/02/10(水) 00:28:55分からないのは慣れてないからだと思ふ。
というかこれが理解できなくてC++を書くのは危険かと。
初期化リストっていうのは、そのクラスが持っているメンバと基底クラスのコンストラクタを
自分のコンストラクタが走る前に動かす事を記述するためのもので、
struct test : virtual base{
inner_member a;
test(int n) : base(n), a(n){ std::cout << "test ctor" << std::endl; }
};
test instance(111);
baseクラスのコンストラクタが走り、次にaの型であるinner_memberクラスのコンストラクタが走り、
最後に最派生クラスtestのコンストラクタtest::test(int)が走ってtest ctorと出力される。
ちなみにvirtual継承っていうのは継承関係を動的に解決する事を指定するためのもので、
urlの
1は. 通常の継承と同じ様に初期化子を記述してもよいと言っている
2は.
仮にtestをvirtual 非virtualを問わず継承するクラスが他にあれば
そのクラスのインスタンスにおいてtestは最派生ではないのでtestで記述された初期化子は無視されると言っている
3は.
最派生クラスは自分が直接virtual継承を行っていなくても中間のクラスが何かvirtual継承をしていれば
virtual継承されているそのクラスの初期化子を記述しなければいけないと言っている
通して、特に初期化子の記述がなかった場合はデフォルトコンストラクタが走る。
(これは通常の継承と共通)
そして、3において2から中間クラスのコンストラクタで記述されたvirtual継承したクラスへの初期化子は
無視されるから注意。
というか、これが分からないとC++のエラーもまともに読めないんぢゃない?
簡単なコードを読んで理解を深めるべき。
■ このスレッドは過去ログ倉庫に格納されています