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

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

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

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

Q&A

解決済

1回答

629閲覧

c++ 実行時型情報ではなくてその時の型を知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

C++

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

0グッド

0クリップ

投稿2019/04/24 10:28

typeid().name()を使うと実行時型情報が得られる思うのですが自分がやりたいことは型を実行中にキャストしたときのその時の型リアルタイム?
の型情報が欲しいのですがどうすれがいいのでしょうか?

p = dynamic_cast<derived*>(p);

上のコードを実行するとpの型がderived型キャストするはずなので
typeid().name()ではderived
型と表示されるはずですか?実行時型情報なのでbase*と表示されてしまいますどうすればいいのか教えてくれますでしょうか?

class base { public: base() { cout << "base コンストラクタ\n"; } virtual ~base() { cout << "~base デストラクタ\n"; } void bfun() { cout << "基底関数\n"; } void tf() { cout << "基底クラス tf()\n"; } virtual void vf() { cout << "仮想基底f\n"; }; }; class derived : public base { public: derived():base() { cout << "derived コンストラクタ\n"; } ~derived() { cout << "~derived デストラクタ\n"; } void tf() { cout << "派生クラス tf()\n"; } void dfun() { cout << "派生関数\n"; } virtual void vf() { cout << "仮想派生f\n"; } }; int main() { derived* x = new derived(); cout << typeid(x).name()<<endl; dynamic_cast<base*>(x); cout << typeid(x).name()<<endl; printf("\n\n\n"); base* p = new derived(); p->tf(); cout << typeid(p).name() << endl; //p = (derived*)p; p = dynamic_cast<derived*>(p); cout << typeid(p).name() << endl; delete p; cout << typeid(p).name()<<endl; p = new base(); p->tf(); cout<<typeid(p).name()<<endl; //derived* x = new base(); int _r = _getch(); return 0; }

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

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

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

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

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

guest

回答1

0

ベストアンサー

C++詳しくないので間違い・不適切な点があったらスミマセン。

上のコードを実行するとpの型がderived*型キャストするはずなので

pの型(pという変数の型)はあくまでbase*であり、キャストしているのは変数pに格納されたポインター値(value)の方だと思います。

typeid(p).name()ではderived*型と表示されるはずですか?

「違う」ということになると思います。typeid(EXPRESSION)はEXPRESSIONの型が何かを問題にしますのでEXPRESSIONがpなら変数pにどういうオブジェクトのポインターが入っているかとは関係なく結果は変数pの型、すなわちbase*型となり、実行結果もそうなっていると思います。pにnullptrを代入してみてください。それでもtypeid(p).name()はP4baseすなわちbase*になります。

質問者さんがやりたいのは「pが指す先の実際のインスタンスの型」ではないのでしょうか?それならば

typeid(*p).name()

で得られるかもしれないと思い、やってみたところ実際そうなりました。

c++

1... 2base* p = new derived(); 3cout << typeid(p).name() << endl; 4cout << typeid(*p).name() << endl; 5...

==>

P4base 7derived

論理的な回答でなくてスミマセン。


Windows 10, cygwin64 bit, g++ (GCC) 7.4.0


追記: ちょっと実験した結果を回答したのですが不十分な内容だった思います。期待通りに求められるのはvtableがあるようなケースだけのように思えます。virtualが一つもないクラスだと派生クラスのインスタンスに対してもtypeid(*p)はbaseと表示されました・・・
ここは詳しい方の回答をお待ちいただいた方がよさそうです。失礼いたしました。

投稿2019/04/24 14:05

編集2019/04/24 14:24
KSwordOfHaste

総合スコア18392

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問