mcrblog

vcpp-ml

2001年01月

31

[vcpp 00050581] Re: 派生クラスについて

日峰です。

Subject: [vcpp 00050571] Re: 派生クラスについて

# そろそろ帰ります。

virtualはメンバ関数につけるのと、
基底クラスに指定するのとはまったく違う意味です。

クラスBにはクラスAからのクラスXがあるから、
クラスXを改めて指定するのは不要では?。

<質問を確認します>

多少簡略しています。

class A : public X
class B : public A
class CHogeWnd : public B

CHogeWndで、
A::Initを実行した以降は、funcコールは、A::funcsubコールになる。
B::Initを実行した以降は、funcコールは、B::funcsubコールになる。

</質問を確認します>

質問の意味が違うなら、以降は無視してください。

どのように作成したかわからないので、
何がいけないのかわかりません。
とりあえずリビルドしてください。

考えとしては、関数へのポインタにするのが妥当と思います。
それで実現可能か知りません。
もしかしたら結構難しいのかも。

私も最初、仮想関数かと思いました。

やはりクラスで話を進めるより、具体的(最終的なクラスや
変数(オブジェクト)の使用例)でないと判りにくいと、
私は考えています。

>   ((CHogeWnd*)clsinfo.mainObj)->func();

clsinfoって何?。どのクラスのメンバ?。
キャストした理由は?。キャストしていいの?。
その他のメンバ関数やメンバ変数も?。

コンパイラによって異なりますし、
ソースがないので追えませんが、
VCは多重継承しているとthisって変化しますよ。

class C : public A, public B;
CクラスはAクラスとBクラスが含まれている。

CオブジェクトからB::functionを呼び出すとき、
B::functionはBクラスのメンバ関数なので、
Cオブジェクトを渡されても困ります。
Cオブジェクトに含まれているBオブジェクトの部分を
thisポインタとしてB::functionが呼ばれます。
31

[vcpp 00050580] Re: 派生クラスについて




> επιστημηです。

> [[vcpp 00050571] Re: 派生クラスについて] Yasuhiro.Kambe wrote:
> >一応、概略を補足致します.
> >#これでも上手く説明できているか不安!!
> >class A: public virtual X {
> >void Init();
> >void funcsub(){....};
> >
> >}
> >class B:public virtual A,
> >           public virtual X
> >{
> >void Init();
> >void func();
> >void funcsub(){....};
> >}
> >のようにクラス全体がvirtualしてます.
> >(実際のはもっと多数のクラスがvirtualしてます.)
> >#virtual 良く理解してません.^^;

> では質問は virtual をよく理解してからにしてください。

その通りですね.
神戸です.
上記の方法で,
きちんとA,Bオブジェクト(クラスを)を作成すれば,
できました.
CHogeDlg::Test(){
   A a; //A構築
   B b; //B構築
   A* ptr;
   ptr = &a;
   ptr->func();
   ptr = &b;
   ptr->func();
}
  とすれば、ポインタのさすクラスメンバが使用されていました.
 #Virtual...なるほどと感じました...m(_ _)m
しかし、実際は
CHogeDlgクラスはA,Bの派生クラスとなっており,
(こうした理由は、A,Bのメンバを直接参照するためです)
A a;のように構築していないのです.
構築していないので、必ず派生クラスのメンバが先に読み込まれて
しまうようです.
この場合は、クラススコープで凌ぐしか方法はなさそうです.
Ex 
class A {
char classtype;
void func(){
   if(classtype=='1') /*初期化関数でクラスタイプを
       A::funcsub();
   else
       funcsub() //派生クラスをしよう
}

void ClassInit()
{
  classtype = '1';
}

virtual funcsub(){
}
}

class B {
void ClassInit()
{
  classtype = '2';
}

virtual funcsub(){
}

のように....(変に感じますが...)

本当に正しいのかな??(まだ勉強不足!!)
31

[vcpp 00050579] Re: クラスの外に構造体でリンクエラー

επιστημηです。

[[vcpp 00050575] Re: クラスの外に構造体でリンクエラー] DENCHU wrote:
> こういう手法ってあまり使われないのでしょうか?(^^;
>...
> #ifndef GLOBAL
> #define GLOBAL extern
> #endif
>
> GLOBAL int hoge;

GLOBAL int hoge;
GLOBAL int payo;

なとき、hogeをhoge.cpp, payoをpayo.cppに定義したいときに困っちゃう...

----:----:----:----:----:----:----:----:----:----:----
Fumiki Fukuda (episteme) -- magical, but never a magic
31

[vcpp 00050576] RE: <解決> CPropertyPageEx::OnCancel をキャンセルする方法

西沢@東芝情報システムです。

  ご教授いただいた以下の方法で、あっけなく解決しました。

  msdn にしっかり書いてましたね...。
CDialog から派生してきているので、 OnCancel() しか見ていませんでした。

  ありがとうございました!!

 > >CPropertyPageEx::OnCancel を実行し、
 > >継続するならば、何もしないで戻る
 > >(つまり、CPropertyPageEx::OnCancel を実行しない)としています。
 >
 > OnQueryCancel()メンバ関数をオーバライドする必要があります。
 > OnCancel()では期待の動作はできません。
 >
 > OnQueryCancel()でFALSEを返せばOKです。
 > TRUE復帰で画面は閉じられます。


--------------------------------------------------------------------
Ryo Nishizawa.
 Outsourcing Service Business Group.
 TOSHIBA INFORMATION SYSTEMS (JAPAN) CORPORATION.
 7-1 Nisshin-cho, Kawasaki-ku, Kawasaki-city 210-8540, Japan.
   Telephone: +81-44-200-5265  Facsimile: +81-44-200-5198
   e-Mail: R...@tjsys.co.jp  Web: http://www.tjsys.co.jp/
(Today's My Favorite Link: http://www6.freeweb.ne.jp/art/milkwatr/ )
--------------------------------------------------------------------
31

[vcpp 00050578] Re: クラスの外に構造体でリンクエラー

επιστημηです。

[[vcpp 00050574] Re: クラスの外に構造体でリンクエラー] itotyu wrote:
>やはりC++を使う以上、クラスを作って継承のツリー構造でグローバル
>変数を実現せよ、ということなんでしょうね。

継承のツリー構造? グローバルとは何の関係もないんちゃう?

>Cでは再定義のエラーのときには#ifndefなどを利用したのですが、C++
>のヘッダは#ifdefなどが大量にあるので臆してしまいました。

....いみふめ。

----:----:----:----:----:----:----:----:----:----:----
Fumiki Fukuda (episteme) -- magical, but never a magic
記事検索
Amazon.co.jp
  • ライブドアブログ