C++勉強中の者です。本屋にでも行けば分かる内容だと思うのですが、急を要するので何卒お願いします。
たとえばA,B,Cというクラスを動作させる場合、
a->Update();
b->Update();
c->Update();
このようにインスタンスの数だけ記述するのではなく、一律した処理で済ませたいです。昔どこかで読んだ本で仮想関数を使えばできると書いてあったのですが、その原理がよく分からなくて困っています。どうすれば可能でしょうか。
ちなみに、
ABCUpdate()
{
a->Update();
b->Update();
c->Update();
}
こういう関数を作ればいいというのはナシでお願いします。
No.2ベストアンサー
- 回答日時:
普通に考えたら仮想関数でしょうね……。
class Updatable
{
public:
virtual ~Updatable() { }
virtual void Update() = 0;
};
を用意しておいて,
class A : public Updatable { /* ... */ }
class B : public Updatable { /* ... */ }
class C : public Updatable { /* ... */ }
のように各クラスはUpdatableを継承し,
std::vector<Updatable *> updatables;
updatables.push_back(a);
updatables.push_back(b);
updatables.push_back(c);
のようにstd::vectorなり配列なりに追加しておけば,
for (int i = 0; i < updatables.size(); ++i) updatables[i]->Update();
のように書けます。
# 上記では警告がでるかもしれませんが。
回答ありがとうございます。
僕の記憶では確か、
親クラスがUpdate()を実行すると、子クラスでオーバーライドされたUpdate()も勝手に実行されるような仕組みがあったような気がするんですが、勘違いの可能性が高そうですね。
ともかく参考にさせていただきます。
No.3
- 回答日時:
一括して行うということで良いでしょうか?
多分以下のような方法が取れると思います。
クラスA,B,Cの親クラスをSとする。
-----クラスの宣言-------------------------
class S{
public:
virtual void update();
};
class A : public S{
public:
void update();
};
class B : public S{
public:
void update();
};
class C : public S{
public:
void update();
};
void S:update()
{
}
void A:update()
{
}
void B:update()
{
}
void C:update()
{
}
-----ソースコード-------------------------
main()
{
A a;
B b;
C c;
S *s[3];
s[0] = &a;
s[1] = &b;
s[2] = &c;
for (int i = 0 ; i < 3 ; i++ ){
s[i]->update();
}
}
-----------------------------------------
親クラスのポインタに子クラスのポインタを代入し、使用する所が味噌です。
変数sはvector等で実装するか、自分でリスト構造で実現するか等します。
No.1
- 回答日時:
急いでいるというのはさておいて, 質問の内容が今一つ読み取れません.
・クラス A, B, C と a や b や c の関係はどうなっていますか? あるいは A, B, C といったクラス同士の関係はどうなのでしょうか?
・「一律した処理」ってどういうこと? 普通の日本語では「一律する」という表現は意味を持たないと思うので, もっと分かりやすい表現をお願いします.
A a;
B b;
C c;
として、それぞれのクラスについての共通点はUpdate()というメソッドを持っていることだけです。
インスタンスの数に関わらずに1行(行がどんどん増えたりないという意味での一律)で書けるような方法を探しています。分かりにくくて申し訳ありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL 下の画像はSQLの4大命令の性質をまとめたものであるらしいです UPDATE INSERT DELE 1 2023/06/07 15:36
- Windows 10 Windows Updateが動作しません 7 2022/08/12 16:26
- Windows 10 BitLocker 回復キーの入力 1 2022/10/09 15:23
- PostgreSQL SQLでUPSERTを一度に複数行やる方法 3 2022/03/25 15:17
- セキュリティホール・脆弱性 ウィルス感染してしまいました。 3 2022/11/27 10:02
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- UNIX・Linux shellscript内のコマンドを、sudo(toor)として実行 2 2022/09/23 15:05
- ノートパソコン ThinkPad A485 BIOS update後、聞いたことのない音がしてPCが起動しない。 と 2 2022/05/25 19:10
- Windows 10 windows11 update の「更新の再開」について初歩的な質問なのですが 1 2022/10/19 00:57
- Windows 10 数年前からWindows10 の Update ができないです。なぜですか? 7 2022/11/09 06:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
範囲外の数値を代入したらエラ...
-
c++,ある関数のクラスから別の...
-
構造 他のクラスの構造体を別...
-
java.util.ArrayListクラスの継承
-
無名パッケージからのインポート
-
内部クラスのインスタンスを動...
-
super.paint(g)を呼び出す意...
-
C#にて別クラスの関数を使いたい
-
C++/C#間での構造体の引き渡し...
-
ひとつのファイルにクラスは1つ?
-
親クラスから子クラスへアクセス。
-
C# 子->親の通知にBeginInvoke...
-
import と extends について
-
C++でfriendクラスにしているの...
-
C#のクラスライブラリでメッセ...
-
継承したクラス側のクラス名の取得
-
C# インターフェイスの実装
-
「タイプ初期化子が例外をスロ...
-
変数名の付け方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
クラス間でのデータ参照
-
関数内の変数に<summary>コメン...
-
c++,ある関数のクラスから別の...
-
範囲外の数値を代入したらエラ...
-
C#にて別クラスの関数を使いたい
-
無名パッケージからのインポート
-
java-別クラスの変数の使い方を...
-
SwingでgetContentPaneのエラー...
-
C++でfriendクラスにしているの...
-
C#でほかのファイルにある自作...
-
Java リフレクションについて
-
Java
-
import と extends について
-
C#のクラスライブラリでメッセ...
-
a href="..." とServlet
-
ひとつのファイルにクラスは1つ?
-
構造 他のクラスの構造体を別...
-
親クラスから子クラスへアクセス。
-
内部クラスのインスタンスを外...
-
visual studioのデザイナ画面で...
おすすめ情報