A7Mの日記: 覚え書き:C++のコンストラクタに関する注意点 2
そっかぁ、C++のコンストラクタって、継承元のメンバを初期化出来ないんだ。だから、
class CBase
{
protected:
int m_Member;
};
class CDerived : public CBase
{
public:
CDerived() :
m_Member(0) // ←エラー!
{
}
};
なんて感じで、継承先クラスのコンストラクタで継承元のメンバは個々に初期化出来ずにエラーになる。
その場合は、継承元クラスのコンストラクタで初期化する必要がある。(プログラミング言語C++第三版 P360-P361)
う~ん、出来るものと思って、一瞬ハマってしまったぞ!(゚∀゚)アヒャヒャヒャヒャ
しかし、これらのエラーメッセージはよく判らん!
gcc 3.3.3(cygwin)
test.cpp: constructor 内の `CDerived::CDerived()':
test.cpp:16: error: class `CDerived' does not have any field named `m_Member'
bcc32
エラー E2312 test.cpp 16: 'CBase::m_Member' は曖昧でない基本クラス 'CDerived' ではない(関数 CDerived::CDerived() )
VC++
test.cpp(17) : error C2614: 'CDerived' : イニシャライズ リスト内のクラス 'm_Member' が基本クラスでもメンバでもありません。
22:53 追記:
正解は、ACさんのコメント。
あと、「プログラミング言語C++」って、"TC++PL"って略すんだ。( ・∀・)つ〃∩ ヘェーヘェーヘェーヘェーヘェー
こういうことじゃなくて? (スコア:0)
// ごめん
class CBase
{
public:
CBase( int &p_i )
: m_Member( p_i )
{
}
protected:
int m_Member;
};
class CDerived : public CBase
{
public:
CDerived( int &i )
: CBase( i )
{
}
};
int main()
{
int i = 0;
CDerived cDerived( i );
return 0;
}
Re:こういうことじゃなくて? (スコア:1)
is-aの関係だから派生先で初期化出来るものだと勝手に思いこみ、
派生先のコンストラクタで派生元のメンバを初期化しようとして、プチはまりました。orz
結局、TC++PL [att.com](こう略すのですね。)を参照して解決しました。
最後は、ACさんのソース通りになりました。