現在macOSにて、書籍「やさしいC++ 第5版」の写経をしています。
そこで今、typeid演算子を使って派生クラスのオブジェクトのアドレスを入れた基底クラスのポインタ配列からそれがどの派生クラスかを判断するサンプルを実行したところ。
クラス名 だけでなく。
数字 + クラス名が表示されてしまうということが起こっています。
C++
1#include <iostream> 2#include <typeinfo> 3using namespace std; 4 5//Vehicle宣言 6class Vehicle{ 7protected: 8 int speed; 9public: 10 void setSpeed(int s); 11 virtual void show() = 0; 12}; 13 14//Car宣言 15class Car : public Vehicle{ 16private: 17 int num; 18 double gas; 19public: 20 Car(int n,double g); 21 void show(); 22}; 23 24//Plane宣言 25class Plane : public Vehicle{ 26private: 27 int flight; 28public: 29 Plane(int f); 30 void show(); 31}; 32 33//Vehicle関数定義 34void Vehicle::setSpeed(int s){ 35 speed = s; 36 cout << "速度を" << speed << "にしました。\n"; 37} 38 39//Car関数定義 40Car::Car(int n, double g){ 41 num = n; 42 gas = g; 43 cout << "ナンバー" << num << "ガソリン量" << gas << "の車を作成しました。\n"; 44} 45 46void Car::show(){ 47 cout << "車のナンバーは" << num << "です。\n"; 48 cout << "ガソリン量は" << gas << "です。\n"; 49 cout << "速度は" << speed << "です。\n"; 50} 51 52//Plane関数定義 53Plane::Plane(int f){ 54 flight = f; 55 cout << "便" << flight << "の飛行機を作成しました。\n"; 56} 57 58void Plane::show(){ 59 cout << "飛行機の便は" << flight << "です。\n"; 60 cout << "速度は" << speed << "です。\n"; 61} 62 63//main関数 64int main(){ 65 Vehicle* pVc[2]; 66 67 Car car1(1234,20.5); 68 Plane p1n1(232); 69 70 pVc[0] = &car1; 71 pVc[1] = &p1n1; 72 73 for(int i=0; i<2; i++){ 74 if(typeid(*pVc[i]) == typeid(Car)){ 75 cout << (i+1) << "番目は" << typeid(Car).name() << "です。\n"; 76 }else{ 77 cout << (i+1) << "番目は" << typeid(Car).name() << "ではありません。" << typeid(*pVc[i]).name() << "です。\n"; 78 } 79 } 80}
これの実行結果は
ナンバー1234ガソリン量20.5の車を作成しました。
便232の飛行機を作成しました。
1番目は3Carです。
2番目は3Carではありません。5Planeです。
Program ended with exit code: 0
となります。本にあるサンプルではクラス名はしっかり Car Plane と表記されているのに対し、 3Car 5Plane と表示されてしまいます。何が原因なのでしょうか。
xcodeに原因があるのかと考えterminalから実行してみましたが、結果は同じでした。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/08 17:25
2017/10/11 01:37
2017/10/14 23:31