会社のブログログイン登録スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。245件0以下のように親クラスFigureのvectorに子クラスTriangle、Rectangleを入れています。その際にTriangle、RectangleにあってFigureにはないメソッドgetArea()をvectorの要素から呼び出しています。それをするとFigureのvectorにgetArea()はないというエラーが出てしまいます。endl;できそうな方法これらは見つけましたが、実装方法がわかりません。}}dynamic_castは、指定したポインタ型にキャストできないとnullptrになるので、それをif文で判定して呼び分けることができます。該当の型すべてについてif文を書かなければならないので面倒です。親のクラスに仮想関数がないとdynamic_castが使えないので、Figureに仮想デストラクタを追加しています。C++17が使えるなら、こんな方法もあります。}}こちらも、variantの後に該当の型をすべて並べないといけないので面倒です。個の銅バッジ3variantは知らなかったです。綺麗に書けますが、確かにクラスを並べないといけないのはめんどくさいですね。Information)をチェックしますが、このRTTIはオーバーヘッドとなるため仮想関数/仮想デストラクタをもつクラスでしか利用されません。std::variantでの格納型リスト明示を嫌うなら、std::anyを使うという手もあります。利用側コードはより複雑になりますし、あくまでも手段の一つとして。|1純粋仮想関数を使うことをお勧めします。純粋仮想関数は関数は定義しないものの、派生クラスにはメンバー関数が存在することを保証します。そのまま呼び出すことができます。することをお勧めします。個の銅バッジ3ありがとうございます。今回の例では確かに純粋仮想関数がぴったりですね。ある子クラスがgetArea()を必要としない場合に、純粋仮想関数を親クラスに設定したくないんですよね。14:15純粋仮想関数を使いたくない理由をわかりやすくするためにLineクラスを追加しました。14:22確かにカスタムクラスのforeachはポインタを使った方がいいですね。ありがとうございます。|1これは直接的な回答ではありませんが、C++ダウンキャストに関する根本的な誤解があるようにも見えます。casting)を行います。Rectangle型へ変換したいならソースコード上でRectangle型を明示する必要があります。Triangle型やその他の型へも対応させたいなら、それぞれの型名がソースコード上に現れるのは必然です。派生クラスのメンバ関数を呼び出せるという言語機能です。通常のクラス設計においては、仮想関数の利用をおすすめします。Cにはprint()がないとした時にこの場合にもprint()を仮想関数にすべきでしょうか?「クラス設計意図による」としか回答できません。クラス設計として「print()メンバ関数を持つことを表現」するインタフェース(IPrintable)を用意する案も考えられます。個の銅バッジ1ありがとうございます。|この質問に回答するには、ログインする必要があります。求めていた回答ではありませんか?c++のタグが付いた他の質問を参照する。関数ポインタ1c++のクラスの共変的の意味がわからないです。0派生クラスに基底クラスを代入させたい。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。従って情報を開示できることに同意したことになります。選択した項目のみ受け入れる。