
個々の関数について継承しているかどうかを判定したいんですが、
class CBase
{public:
virtual int A(){return 0;}
virtual int B(){return 0;}
};
これが規定クラスだとして、
class CTest : public CBase
{public:
int A(){return 1;}
int B(){return 1;}
};
のクラスが存在します。
一番有効だと思ってるのが、上記を変えて
CBase :: virtual int A(){throw this_base; return 0;}
のように書けば判定できると思いますが、例外を使うよりもいい方法はありませんか。
No.4ベストアンサー
- 回答日時:
結局、基底クラスから派生クラスが呼ばれるのは、
内部的にはバーチャルテーブルを利用した関数ポインタで
切り分けて呼んでいるわけで。
例外を使って、呼び元がそれを検出したとして、それが
どの派生クラスの例外なのかわからなければ、処理のしようもない。
しかし、呼び元が、派生クラスのタイプを意識するような
仕組みになったら、そんなクラス設計は破綻してますからねぇ。
ウィンドウメッセージの処理だということなら、
こんな感じになるんじゃないのかなと。
http://www.kab-studio.biz/Programing/Codian/MxA/ …
基底クラスはデフォルトのメッセージ処理関数を呼ぶだけ。
派生クラスは自分の処理すべきメッセージなら処理して、そうでなければ
基底クラスのデフォルトメッセージ処理関数を呼ぶ。
>未定義を一挙に親で処理したかった
親は普通あんまり仕事をしないもんですよ。
クラス間の結びつきが強くなるほど、メンテナンス性が失われるので。
この回答への補足
すみません。前の方と間違えました。
返信ありがとうございます。
内部的に結構ポインタを保持しておかないとクラス単位の関数管理とかはできないんですね。
基底クラスは確かに派生クラスに対応する処理をするべきではないと思います。
>>基底クラスはデフォルトの
メンバ関数ポインタでそれを書くか、WndProcの状態を保存しておいて子クラスからデフォルトを呼び出すとかでも全然いいと思いました。
ご回答ありがとうございます。
メンバ関数ポインタを使用したことが無かったんですが、基底の判別が==NULLでできるのとtemplateを使用するのが簡単そうですね。
オーバーライドする時どう設定するのか調べてみます。
No.3
- 回答日時:
こんばんは。
C++のクラスを使用してウィンドウをラップした時、ウィンドウプロシージャとオーバーライドの折り合いをどの様にするのかは、色々な手段があります。
case WM_SYSCOMMAND:
(this->*m_pmf_wm_syscommand)(wParam, lParam);
例えば、MFCでは上記の様にメンバ関数ポインタを使用しています(実際のMFCではもっと複雑であり、名前も違います)。
初期状態では「m_pmf_wm_syscommand」に、基本クラスのメンバ関数が設定されています。
IDEでメッセージに対応したメッセージハンドラを追加するとメンバ関数がオーバーライドされ、「m_pmf_wm_syscommand」にはオーバーライドされたメンバ関数が設定されます。
ご回答ありがとうございます。
メンバ関数ポインタを使用したことが無かったんですが、基底の判別が==NULLでできるのとtemplateを使用するのが簡単そうですね。
オーバーライドする時どう設定するのか調べてみます。
No.2
- 回答日時:
誰がどのように働くか、というのを抽象化して、
柔軟性を持たせるのが継承の役割だったりするしなぁ。
それがわかっていないというのは、設計が崩壊してるって
ことじゃないのかなぁ。
ちなみに私なら、Doxygenでクラス図を吐かせて、確認しますけど。
コードを修正していらぬバグを埋め込みたくないし。
ご回答ありがとうございます。
もともとは未定義のvirtual関数が詰まった内部クラスを基底として作成したクラスを、親(内部クラスの)から呼び出す際に未定義を一挙に親で処理したかったんですが、一般化された方法がわかりませんでした。
クラス図生成してみます。
No.1
- 回答日時:
まず,汎用的な方法はおそらく存在しません。
# ときたま,汎用的な方法が思いも付かないような方法で存在するのがC++の恐いところなので,断定はしません。
・目的は何ですか
たとえば,目的が派生クラスに実装を強制するのであれば,純粋仮想関数にすればよいです。
目的によっては,別の方法で対処できるかもしれませんし。
・処理系は何ですか
場合によっては,処理系が方法を提供してくれているかもしれません。
ご回答ありがとうございます。
環境はVC++2008で、ウィンドウのクラスを作成したので、WndProcの扱いに困ってました。
MFCの呼び出し方法(AfxWndProc<-AfxCallWndProc)が参考になりそうです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++プログラミングコードにポリモーフィズムを取り入れ方を教えてください。 2 2023/06/09 11:17
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 変数のスコープ 5 2023/05/27 17:50
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java java 引数 戻り値のあるメソッド 3 2023/02/12 06:23
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA チェックボックスをオーバ...
-
クラス内の構造体の実体化とア...
-
VisualStudio2005
-
型InternetExplorerが未定義エ...
-
VB.NETでクラスライブラリプロ...
-
一クラス何ステップ以上で読む...
-
C++のクラスのメンバになるクラ...
-
C++勉強中なんですが
-
VC++ Express m_hWnd
-
Delphi2007のCheckBox.Font.Col...
-
プロトタイプなのにexternを使...
-
MFC VC++ 6.0 使用
-
ダイアログ表示時にチェックボ...
-
Serialize で困ってます!!
-
正規表現 [^/]+ の意味を教えて
-
Visual studio express 2013 ...
-
templateのmap処理でエラー
-
クラスプロジェクトのデバッグ
-
クラスの作成方法を教えてください
-
DLLの作り方および使い方について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA チェックボックスをオーバ...
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
イベントにAddHandlerされてい...
-
(UWSC) 「#32770」の意味わかり...
-
ボタンのオーナードローについて
-
MFCアプリのコマンドラインでパ...
-
ダイアログ表示時にチェックボ...
-
【ASP.NET】 独自で作成したク...
-
エディットコントロールでEnter...
-
MFCのドラッグ&ドロップについて
-
オーバーライド関数の呼び出し...
-
DataGridViewのセルに斜線を引...
-
MFCのCListCtrlでスクロールを検出
-
C++ protectedにアクセス不可
-
ダイアログクラスのコントロー...
-
クラスのアドレスを引数として...
-
エディットコントロールのイベ...
-
個々の関数について継承してい...
-
WindowsAPIのリストビューの...
おすすめ情報