質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

22632閲覧

基底クラスから派生クラスのメンバ関数を呼びたい

mushroom314

総合スコア29

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

2クリップ

投稿2017/07/06 18:08

####前提
C++を勉強中の初心者です。
仮装関数としてhoge()をメンバにもつBaseクラスを定義し、そこから以下のようにさまざまな派生クラスを作りました。

C++

1class Base{ 2 public: 3 virtual void hoge(){} 4}; 5class Derived1 : public Base{ 6 void hoge(){ 7 //計算1 8 } 9}; 10class Derived2 : public Base{ 11 void hoge(){ 12 //計算2 13 } 14};

####実装したいこと
派生クラスのインスタンスがごちゃ混ぜになっているリストを定義して、順番にhoge()を実行したい

####試したこと
std::vector<Base>に派生クラスを並べて、以下のように順に呼び出すと、(当然だと思いますが)基底クラスのhoge()が呼ばれ、期待した計算をしません。

C++

1 Derived1 a1, a2, a3; 2 Derived2 b1, b2; 3 std::vector<Base> ba; 4 5 ba.push_back(a1); 6 ba.push_back(b1); 7 ba.push_back(a2); 8 ba.push_back(b2); 9 ba.push_back(a3); 10 for(int i=0;i<5;++i){ 11 ba[i].hoge(); 12 }

ダイナミックキャストをしようかと思いましたが、ダウンキャストは危険と言われています。

次のインスタンスへのポインタをメンバ変数に持たせようかと思いましたが、「順に呼び出す」計算とクラス定義自体があまり関係ないので、できたら分離出来たらいいなと考えています。

####質問内容
以上のことをどう実装すれば解決できるか、お知恵を貸してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こんにちは。

BAでてますが、ちょうどこの関連記事を書きました。仮想関数の仕組みから何故ポインタを使わないといけないかなども解説してます。良かったら参考にされて下さい。

第26回目 オジブェクト指向の3大特長の3つ目「動的ポリモーフィズム」
第27回目 オジブェクト指向の3大特長の3つ目「動的ポリモーフィズム」-補足-

投稿2017/07/07 02:20

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mushroom314

2017/07/07 04:29

まさにこの記事のところで詰まっていました。何故ポインタでないとダメなのかわかり、理解が深まりました。ありがとうございます。
guest

0

ベストアンサー

https://wandbox.org/permlink/6Gz1wmuYVpftYHKO

ポインタで持てばよいのでは。
もちろん生ポインタではなくスマートポインタを使うべきだけれど

投稿2017/07/06 18:23

yumetodo

総合スコア5850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mushroom314

2017/07/06 18:43

autoで型推論ができることを初めて知りました。動くコードも見せていただき、大変勉強になりました。ありがとうございました。
yumetodo

2017/07/06 18:50

>autoで型推論 C++11の機能ですね。ただここで使ったのはRange-based forという別のC++11の機能で確かに型推論も絡みますが全く異なる機能です。 range-based for loopsの要素の型について http://qiita.com/rinse_/items/cdfce8aa6a685a8ebe0c
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問