継承でわからないことがあります。
よろしければアドバイスもらえませんか?
Objectという基底クラスがあります。
中身は
初期化関数
更新関数
描画関数
メンバ変数は
座標、
スケール、
当たり判定用のコリジョンクラスです。
描画関数は全部同じ処理なので
オーバーライドさせず基底クラスに定義を書いています。
今回継承させようとしているのは
プレイヤー
エネミー
ボックス(四角い箱です)
それぞれ当たり判定があり
プレイヤーとエネミーは弾を打ちます。
ボックスは弾が当たったら消えるようになっています。
ですがボックスは弾を打ちません。
基底クラスにBulletクラスを持たせてもいいと思いますか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
質問の意図ですが、下記のようなもので「オーバーライドされていないfuncA()を呼び出す」ということで間違いないでしょうか?
その通りであれば、下記のコードに書いたとおりに基底クラスの関数名を書けばいいです。
回答を受けてコンストラクタとメンバーを追加しました。
c++
1class A 2{ 3public: 4 int memA; 5 A(const A &a) { 6 this.memA = a.memA; 7 } 8 void funcA() { 9 printf("A¥n"); 10 } 11} 12 13class B: class A 14{ 15public: 16 B(const A &a) 17 : A(a) 18 {} 19 20 void funcB() { 21 printf("B¥n"); 22 } 23} 24 25int main() { 26 B objB = new B(); 27 objB.funcA(); 28 if (objB) 29 { 30 delete objB; 31 } 32 return 0; 33}
質問内容の変更に伴い、コードを変更してみました。
ラフなコードを書いているので、細かいところで間違いがあると思いますがご容赦を。
c++
1//オブジェクト種別 2enum { 3 ePlayer = 0, 4 eEnemy, 5 eBox, 6 eMax, 7}; 8 9class Object 10{ 11public: 12 (注釈:本来はprivateにすべきだが、簡単にするためにpublicにしている) 13 int 座標; 14 int スケール; 15 int 当たり判定用のコリジョンクラス; 16 int オブジェクト種別; 17 18 Object (const Object& obj) { 19 座標 = obj.座標; 20 スケール = obj.スケール; 21 当たり判定用のコリジョンクラス = obj.当たり判定用のコリジョンクラス; 22 オブジェクト種別 = obj.オブジェクト種別; 23 } 24 public 初期化関数; 25 public 更新関数; 26 public 描画関数; 27} 28 29class Character: class Object 30{ 31public: 32 Bulletクラス; 33 34 Character (const Character& character) 35 : Object(character) 36 {} 37} 38 39class Player: class Character 40{ 41public: 42 Player() 43 : Character(), 44 オブジェクト種別 = ePlayer 45 {} 46 47 Player(const Player& player) 48 : オブジェクト種別 = ePlayer, 49 Character(player) 50 {} 51} 52 53class Enemy: class Character 54{ 55 Enemy() 56 : Character(), 57 オブジェクト種別 = eEnemy 58 {} 59 60 Enemy(const Enemy& enemy) 61 : オブジェクト種別 = eEnemy, 62 Character(enemy) 63 {} 64} 65 66class Box: class Object 67{ 68 Box() 69 : Object(), 70 オブジェクト種別 = eBox 71 {} 72 73 Box(const Box& box) 74 : オブジェクト種別 = eBox, 75 Character(box) 76 {} 77} 78 79int main(void) 80{ 81 Player *player = new player(); 82 Enemy *enemy = new Enemy(); 83 Box *box = new Box(); 84 Object* objArray[] = {player, enemy, box}; 85 86 for (int i = 0; i < 3; i++) { 87 switch (objArray[i].オブジェクト種別) { 88 case ePlayer: 89 (dynamic_cast<Player*>objArray[i])->(Playerクラス専用関数); 90 break; 91 case eEnemy: 92 (dynamic_cast<Enemy*>objArray[i])->(Enemyクラス専用関数); 93 break; 94 case eBox: 95 (dynamic_cast< Box*>objArray[i])->(Boxクラス専用関数); 96 break; 97 } 98 } 99}
投稿2021/05/14 08:20
編集2021/05/15 17:40総合スコア170
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/14 11:51
2021/05/14 11:53
2021/05/14 11:57
2021/05/14 12:00
2021/05/14 12:08 編集
2021/05/14 12:10
2021/05/14 12:11
2021/05/14 12:16
2021/05/14 12:24 編集
2021/05/14 12:28
2021/05/14 12:30
2021/05/14 12:51
2021/05/14 13:46
2021/05/14 13:47
2021/05/14 13:49
2021/05/14 14:00
2021/05/14 14:06
2021/05/15 13:08
2021/05/15 13:13
2021/05/15 13:15
2021/05/15 13:16
2021/05/15 13:18
2021/05/15 13:21 編集
2021/05/15 13:27
2021/05/15 13:31
2021/05/15 13:31
2021/05/15 13:35
2021/05/15 17:43 編集
2021/05/15 16:06
2021/05/15 16:30 編集
2021/05/16 04:44
0
###案1 キャストする。
キャストすることで派生クラスとして利用する。
###案2 オーバーライド関数を窓口にする。
オーバーライド関数を経由して派生クラス独自関数を呼び出す。
投稿2021/05/15 13:33
総合スコア4830
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
こーゆーことがやりたいのかな?
C++
1#include <iostream> 2#include <vector> 3#include <memory> 4 5class Base { 6public: 7 virtual ~Base() {} 8 void base_fn() { std::cout << "Base::base_fn\n"; } 9}; 10 11class Derived : public Base { 12public: 13 ~Derived() override {} 14 void derived_fn() { std::cout << "Derived::derived_fn\n"; } 15}; 16 17int main() { 18 std::vector<std::unique_ptr<Base>> vec; 19 vec.push_back(std::make_unique<Base>()); 20 vec.push_back(std::make_unique<Derived>()); 21 vec.push_back(std::make_unique<Base>()); 22 vec.push_back(std::make_unique<Derived>()); 23 24 for ( auto& item : vec ) { 25 Derived* der = dynamic_cast<Derived*>(item.get()); 26 if ( der ) { der->derived_fn(); } 27 else { item->base_fn(); } 28 } 29}
投稿2021/05/14 12:22
編集2021/05/14 12:32総合スコア16612
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ですけどmain で処理を呼ぶときに
オーバーライドでない派生クラスの個別の関数って
どうやって呼び出せますか?
おそらく、何かしら設計を誤っています。
「派生クラスにしかない機能を使いたい」のであれば派生クラスの変数に入れるべきですし、基底クラスで参照するなら基底クラスにあるメソッドだけを使うべきです。
投稿2021/05/14 11:58
総合スコア146072
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。