
No.6ベストアンサー
- 回答日時:
#2です。
> GetObject()でなんとかならないかなぁと考えています。
こういうのは「型スイッチ」といって、典型的な禁じ手のひとつです。
どうしてもそれ以外の実現方法がないとか、禁じ手をおかすことで多大なメリットが得られるならともかく、今回の場合はそのようには思えません。
> 既存のソース(基底クラス)は出来ればあまり触りたくないので・・・
だったら非メンバの関数テンプレートを作るとか、もっとよい方法がいろいろあると思います。
> こういうのは「型スイッチ」といって、典型的な禁じ手のひとつです。
そうなのですね・・・
継承しているクラスではいろんな人が手を加えて、ぐちゃぐちゃになっていて、出来れば触りたくないと考えてしまいました。
メンテのし易さも考え、今後方法を検討していきます。ありがとうございました。

No.5
- 回答日時:
「親クラス」の定義が曖昧ですが、C++の基底クラスではないのですか?
状況がわかりませんので、基本的な方針を。
「呼び出し元の情報が欲しければ、呼び出し元でセットしてもらえ」
これが、基本です。
この場合だったら、FuncA(CObject *wk) という形にして、呼び出す方からセットしてもらえば、問題ありません。
もしも、スコープの関係か何かで、呼び出し元で、セットできないとしたら、「呼び出し元とそのオブジェクトの関係」をどう定義するかで、いずれにしても、関連する情報があるはずです。それをセットすればいいです。(オブジェクトの識別名とか)
分かりにくい説明に何度も回答頂きありがとうございます。
> この場合だったら、FuncA(CObject *wk) という形にして、呼び出す方からセットしてもらえば、問題ありません。
FuncAに該当する関数がたくさんあり、また色んなところから呼ばれているので影響範囲が大きいので頭が痛いです・・・
> 「呼び出し元の情報が欲しければ、呼び出し元でセットしてもらえ」
でもこれが【基本】なのですよね、頑張ってみます。ありがとうございました。

No.4
- 回答日時:
No.3 です。
もしも、「オーバーライドに限る」(仮想関数は使えない/使いたくない)というのであれば、基底クラス側を書き直す必要があります。少なくとも、
CObject* 派生クラスA::GetObject(void) は、派生クラスA(または、そのさらに派生クラス)からしか呼び出されませんから、ここでどうあがいても無理です。
---
void 基底クラス::FuncA()
{
FuncB(objectA);
}
void 基底クラス::FuncB(CObject *pObj)
{
// FuncA の GetObject() 呼び出し以降に元々あった処理
……
}
---
void 基底クラス::FuncA()
{
FuncB(objectAA);
}
}
こんな感じです。

No.3
- 回答日時:
一応、どのクラスから呼ばれたかを識別する方法はないことはありません。
ただ、言い換えると、「クラスが増えるたびに書き直しをしなければならない」ということで、普通はあまりいい方法ではありません。それに、派生クラスで定義した関数を、基底クラスから呼び出すことはできないはずですが。
設計が間違っていなければ、この場合、仮想関数にするのは、GetObject() の方です。
---
virtual CObject* 基底クラス::GetObject(void)
{
return objectA;
}
void 基底クラス::FuncA()
{
// FuncA() は、「ふさわしいオブジェクト」を作って……
CObject *pObj = GetObject();
// それ以降の「共通の処理」をする。
}
---
virtual CObject* 派生クラスA::GetObject(void)
{
return (自分のクラスで返したいオブジェクト);
}
また、おそらくは、
---
virtual CObject* 基底クラス::GetObject(void) = 0; // 純粋仮想関数にする
void 基底クラス::FuncA()
{
CObject *pObj = GetObject();
……
}
---
virtual CObject* 派生クラスA::GetObject(void)
{
return (自分のクラスで返したいオブジェクト);
}
// 各クラスで、ふさわしいオブジェクトを返す
のほうが、全体の設計がすっきるするはずです。
この回答への補足
すみません、私の説明不足です。
・基底クラスというか親クラスです。
・仮想関数は、GetObject()です。
派生クラスAのGetObject()が呼ばれたときは、その呼び出し元に応じて「objectAA」或いは「objectBB」を返したいです。
派生クラスA内の関数からGetObject()がコールされた場合は「objectAA」、親クラスからコールされたときは「objectBB」といった具合です。
No.2
- 回答日時:
それこそ仮想関数をオーバーライドすればよいのでは?
この回答への補足
補足します。
仰るように、FuncA()を派生クラスにも持てば良いのかもしれませんが
GetObject()以降に続く処理が全く同じために(しかも長い)、
GetObject()でなんとかならないかなぁと考えています。
既存のソース(基底クラス)は出来ればあまり触りたくないので・・・
---
CObject* 基底クラス::GetObject(void)
{
return objectA;
}
void 基底クラス::FuncA()
{
CObject *pObj = GetObject();
・・・
}
---
CObject* 派生クラスA::GetObject(void)
{
if (...) {
// 基底クラスから呼ばれたとき
// objectAAを返したい
return objectAA;
} else if (...) {
// 派生クラスから呼ばれたとき
// objectAAを返したい
return objectBB;
}
}
No.1
- 回答日時:
関数がオーバーライドされているのなら、クラスを指定して呼び出さない限りはそのクラス内のオーバーライド関数が呼び出されるだけだと思いますが。
オーバーライドされていないのなら継承クラスからは基底クラスの関数が呼び出されるでしょうけど。
以下、「オーバーライドでない」関数の呼び出し元を判定する方法。
(1)基底クラスから継承クラスまでそれぞれ固有の値を持つメンバ変数を用意する。
(2)継承される関数の引数にそのメンバ変数を渡すようにする。
以上で呼び出し元のクラスは判明するはずですが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript カラーミーショップのsectionループ内で、[引数][戻り値]ありの関数的な処理を行いたいです。 1 2022/05/07 19:39
- その他(プログラミング・Web制作) Pythonで複数のメソッドをまとめて管理する方法について 1 2023/03/30 00:01
- Excel(エクセル) Indirect関数について、Formulatextで抽出した数式を参照したい。 1 2022/12/15 11:16
- 韓国語 韓国人同士の呼びかけ方 2 2022/06/16 21:54
- Excel(エクセル) エクセルの自動更新のタイミングについて 1 2022/07/20 16:12
- 学校 今年初めてクラスが同じになった女子がいるんですけどなんて呼んだらいいか分からなくてこの数ヶ月呼びかけ 4 2023/07/14 17:10
- Visual Basic(VBA) vba Sleep関数について教えてください 1 2023/01/18 10:18
- 数学 特定の座標点を通る回帰を行う方法について。 2 2022/10/10 10:27
- C言語・C++・C# C言語のwhileを含む関数について 2 2022/12/16 12:28
- 会社・職場 【至急】 自分の旦那が、職場の異性の部下に対して名前呼びしていたら嫌ですか? また、自分の嫁が異性の 5 2023/01/15 09:59
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
(UWSC) 「#32770」の意味わかり...
-
VBA チェックボックスをオーバ...
-
【ASP.NET】 独自で作成したク...
-
クラスのアドレスを引数として...
-
関数の呼び出し元の検索
-
オーバーライド関数の呼び出し...
-
VC++ 7.1 で メインウィンドウ...
-
既定のコンストラクタがない?
-
OnPaintとOnDraw関数の違いにつ...
-
DateAdd関数について質問があり...
-
VBのシステムの設計書にUMLは適...
-
FriendとPublicの違い。。。
-
ウィンドウの背景に画像を配置する
-
Delphi6でVB.NETで作成のDLL呼出
-
DLLからEXEのクラスを呼び出す...
-
ダイアログ表示時にチェックボ...
-
エディットコントロールのイベ...
-
DataContextについて
-
個々の関数について継承してい...
-
C++ protectedにアクセス不可
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA チェックボックスをオーバ...
-
FriendとPublicの違い。。。
-
既定のコンストラクタがない?
-
イベントにAddHandlerされてい...
-
(UWSC) 「#32770」の意味わかり...
-
ボタンのオーナードローについて
-
MFCアプリのコマンドラインでパ...
-
ダイアログ表示時にチェックボ...
-
【ASP.NET】 独自で作成したク...
-
エディットコントロールでEnter...
-
MFCのドラッグ&ドロップについて
-
オーバーライド関数の呼び出し...
-
DataGridViewのセルに斜線を引...
-
MFCのCListCtrlでスクロールを検出
-
C++ protectedにアクセス不可
-
ダイアログクラスのコントロー...
-
クラスのアドレスを引数として...
-
エディットコントロールのイベ...
-
個々の関数について継承してい...
-
WindowsAPIのリストビューの...
おすすめ情報