- PR -

VC++ クラスの関数の呼び出し

投稿者投稿内容
white
会議室デビュー日: 2006/01/20
投稿数: 6
投稿日時: 2006-01-20 12:10
Listboxobクラスに純粋仮想関数を作ってないです。
一番大元のIobクラスだけ、純粋仮想関数を持っています。

ListboxobクラスをもしListboxob.hファイルに書いたら、
Listboxob.cppファイルには、クラス中で宣言している関数の定義だけして、
Listboxob.hファイルをincludeすればいいですよね!?

Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2006-01-20 12:17
引用:

whiteさんの書き込み (2006-01-20 12:10) より:
Listboxobクラスに純粋仮想関数を作ってないです。
一番大元のIobクラスだけ、純粋仮想関数を持っています。


そのIobクラスの全ての純粋仮想関数はListboxobクラスで実装していますか?
でないと使えませんよ。
(提示されたソースのみならば発生しません。)

引用:

ListboxobクラスをもしListboxob.hファイルに書いたら、
Listboxob.cppファイルには、クラス中で宣言している関数の定義だけして、
Listboxob.hファイルをincludeすればいいですよね!?


そうです。

ここと似たような話になってきている。。。

[ メッセージ編集済み 編集者: Blue 編集日時 2006-01-20 12:20 ]
white
会議室デビュー日: 2006/01/20
投稿数: 6
投稿日時: 2006-01-20 12:26
Iobクラスの全ての純粋仮想関数はListboxobクラスで実装していません。
一部の純粋仮想関数はCobクラス中で実装しています。
ListboxobクラスはCobクラスを継承していますから、
大丈夫ですよね!?



Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2006-01-20 12:32
こんんちは。

引用:

whiteさんの書き込み (2006-01-20 12:26) より:
Iobクラスの全ての純粋仮想関数はListboxobクラスで実装していません。
一部の純粋仮想関数はCobクラス中で実装しています。
ListboxobクラスはCobクラスを継承していますから、
大丈夫ですよね!?



大丈夫じゃないです。
純粋仮想関数の実装は、派生クラスで漏れなく実装してください。

Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2006-01-20 12:37
引用:

一部の純粋仮想関数はCobクラス中で実装しています。


一部ではダメです。
Listboxobからみて、親クラスでたとえ一つでも純粋仮想関数が実装されていない状態では使えません。

例)
コード:
class Base
{
public:
    Base() {}
    virtual ~Base() {}

    virtual void Test() = 0;
    virtual void Test_2() = 0;
};

class Hoge : public Base
{
public:
    Hoge() : Base() {}
    virtual ~Hoge() {}

    // Baseクラスの一部の純粋仮想関数を実装
    virtual void Test() {}

};

class Moge : public Hoge
{
public:
    Moge() : Hoge() {}
    virtual ~Moge() {}
};

int main()
{
    Moge m; // 親クラスに実装されていない純粋仮想関数 Test_2 が
            // あるため C2259 のエラーがでる
    return 0;
}

white
会議室デビュー日: 2006/01/20
投稿数: 6
投稿日時: 2006-01-20 12:59
私の言い方が悪かったようです。

Iobクラスにあるすべての純粋仮想関数は、
その派生クラスCob中ですべて実装しています。
Listboxobクラスでは、Cobクラス中の一部の関数をもう一回定義しています。

class Iob
{
public:
virtual void autoatach() = 0;
virtual void setatach() = 0;
};

class Cob:public Iob
{
public:
Cob();
virtual ~Cob();
virtual void autoatach();
virtual void setatach();
};

Cob::Cob()
{
}
Cob::~Cob()
{
  ****************;
}
void Cob::autoatach()
{
}
void Cob::setatach()
{
*****************;
}

class Listboxob:public Cob
{
public:
Listboxob();
~Listboxob();
virtual void autoatach();
void gotosrc();
private:
void setdata();
};
Listboxob::Listboxob():Cob
{
}
Listboxob::~Listboxob()
{
}
void Listboxob::autoatach()
{
***********;
}
void Listboxob::setdata()
{
************;
}
void Listboxob::gotosrc()
{
setdata();
}

という感じです。
Blue
大ベテラン
会議室デビュー日: 2005/09/12
投稿数: 230
お住まい・勤務地: 知っている人は知っている
投稿日時: 2006-01-20 13:14
引用:

whiteさんの書き込み (2006-01-20 12:59) より:
私の言い方が悪かったようです。

Iobクラスにあるすべての純粋仮想関数は、
その派生クラスCob中ですべて実装しています。
Listboxobクラスでは、Cobクラス中の一部の関数をもう一回定義しています。


ならば、そのようなエラーはでないはずなんですが。
リビルドしても、同じようでしたら
エラーメッセージをそのまま張ってもらえますでしょうか?

それと、Listboxob::~Listboxob() の宣言に virtual がないのは意図的でしょうか?

コードを載せるときは〔code〕〔/code〕で囲いましょう。
※ 〔〕は実際は半角です。
white
会議室デビュー日: 2006/01/20
投稿数: 6
投稿日時: 2006-01-20 16:16
コードを下のように変更して、

@ファイルListboxob.hを作成して、クラスListboxobの宣言をこのファイルに書き
AファイルListboxob.cppにListboxob.hをincludeする
BファイルCrosdialogob.cppにListboxob.hをincludeする
CファイルCrosdialogob.cppで、関数Crosdialogob::callgotosrc()の中で
Listboxob list;
list.gotosrc();
 として、クラスListboxobの関数gotosrc()を呼び出す。

リビルドしたところ、抽象クラスのインスタンスが作成できないという
エラーが無くなりました。
しかし、クラスListboxobは有効なデフォルトコンストラクタがないと言われます。
”有効なデフォルトコンストラクタ”とは何でしょうか?

引用:

Blueさんの書き込み (2006-01-20 13:14) より:

それと、Listboxob::~Listboxob() の宣言に virtual がないのは意図的でしょうか?



意図的というわけではありません。
デストラクタをvirtual宣言するのとしないのとで何が違うかがわかりません。。。

スキルアップ/キャリアアップ(JOB@IT)