パスワードを忘れた? アカウント作成
561626 journal

A7Mの日記: 覚え書き:C++のコンストラクタに関する注意点 2

日記 by A7M

そっかぁ、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"って略すんだ。( ・∀・)つ〃∩ ヘェーヘェーヘェーヘェーヘェー

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2005年08月09日 18時47分 (#779567)
    // 意図がわからなかったので大幅に勘違いしているかもしれない。
    // ごめん

    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;
    }
    • その通り、大正解です。

      is-aの関係だから派生先で初期化出来るものだと勝手に思いこみ、
      派生先のコンストラクタで派生元のメンバを初期化しようとして、プチはまりました。orz
      結局、TC++PL [att.com](こう略すのですね。)を参照して解決しました。

      最後は、ACさんのソース通りになりました。

      親コメント
typodupeerror

あと、僕は馬鹿なことをするのは嫌いですよ (わざとやるとき以外は)。-- Larry Wall

読み込み中...