ポリモーフィズムがうまくいかない理由

このQ&Aのポイント
  • ポリモーフィズムの概念を理解しないまま利用している可能性があります。
  • クラスの継承関係やオーバーライドが正しく行われていない可能性があります。
  • 入力値の取得や呼び出し方法に誤りがある可能性があります。
回答を見る
  • ベストアンサー

ポリモーフィズムがうまくいきません

タイトルのままなのですが、、うまくできません。 間違っているところの指摘お願いします。 #include <iostream> using namespace std; class kuruma{ public: void view(void){printf("車\n");} }ku; class hutuu : public kuruma{ public: void view(void){ printf("普通車\n"); } }hu; class track : public kuruma{ public: void view(void){ printf("トラック\n"); } }to; int main(void) { char input[10]; kuruma *oya1=&ku , *oya2=&hu , *oya3=&to;; oya1->view(); oya2->view(); oya3->view(); scanf("%s",input); return 0; }

質問者が選んだベストアンサー

  • ベストアンサー
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

> void view(void){printf("車\n");} < virtual void view(void){printf("車\n");} C++ではポリモフィズムする関数は基底クラスにてvirtual宣言されていなければいけません。

JIF0131
質問者

お礼

基底クラスの関数にvirtualを追加して無事解決しました。 ありがとうございました。

関連するQ&A

  • 生成もとのクラスへのアクセス

    clsB::vfFuncB関数ないで clsA::lVarAにアクセスする方法がありましたら 教えて下さい。 #include <stdio.h> class clsB{ public: clsB(){}; ~clsB(){}; void vfFuncB(){ printf("clsB::vfFuncB\n"); printf("clsA::lVarAをアクセスしたい\n"); }; }; class clsA{ public: clsA(){}; ~clsA(){}; void vfFuncA(void){ clsB oB; oB.vfFuncB(); }; void vfSet(long lA){lVarA=lA;} long lfGet(void) {return lVarA;} private: long lVarA; }; void main(void) { clsA oA; oA.vfFuncA(); }

  • templateのエラー

    すいません、C++始めたばっかりなのですが、 以下のようなエラーが出て困っています。 ClusteringMain.obj : error LNK2001: 外部シンボル ""public: void __thiscall File2Array<double>::disp(void)" (?disp@?$File2Array@N@@$$FQAEXXZ)" は未解決です。 どなたかご教授ください。 環境はWindows XP, Visual Studio.NET 以下はソースです。 --------ClusteringMain.cpp------------ #include < iostream > #include"File2Array.h" using namespace std; int main() { cout << "Hello world" << endl; File2Array<double> test; test.disp(); return 0; } ---------File2Array.cpp----------------- #include"File2Array.h" template <class Type> void File2Array<Type>::disp(void) { cout << "aaaaa" << endl; } ---------File2Array.h------------------- #include<iostream> #include<fstream> using namespace std; #ifndef FILE2ARRAY_H #define FILE2ARRAY_H 1 template <class Type> class File2Array { private: Type var; public: void disp(void); }; #endif // #define FILE2ARRAY_H 1

  • 仮想関数と継承について

    #include <iostream> using namespace std; class AAA { public: virtual aaa() { cout <<"aaa(void)"<<endl;} }; class BBB : public AAA { public: virtual aaa(int a) { cout <<"aaa(int)"<<a<<endl;} }; int main() { BBB bbb; bbb.aaa();<--これがエラーになります。 return 0; } どうして、既定クラスの引数なしのaaa()はよぶことが できないのでしょうか?

  • インスタンス化の"class"の有無による違い

    インスタンス化のときに、以下の(1)と(2)の「class」の有無によって何が変わるのかわからないです。教えて下さい。 (1)class [クラス名] [オブジェクト名]; (2)[クラス名] [オブジェクト名]; 以下に例としてコードとその出力結果を示します。 コード----------------------------------------------------- #include <iostream> using namespace std; class Property { public: double mass; }; int main( ) { class Property material_one; Property material_two; material_one.mass=5.0; material_two.mass=3.0; cout << material_one.mass << "\n"; cout << material_two.mass << "\n"; return 0; } ------------------------------------------------------------- 出力結果-------------------------------------------------- 5 3 -------------------------------------------------------------

  • 試作クラス使用C++プログラムが動かない原因

    試しに作成した以下のプログラムにビルドエラーが発生し,困っているので質問しました. コンパイラは,「BBB *b」などクラスポインタ変数の部分がエラーと指摘しているのですが(他にも数か所ありますが…),間違っている理由が分からず困ってます. ご回答,よろしくお願い致します. ----------------------------------- #include <iostream> using namespace std; class AAA { public: // コンストラクタ AAA(){ b = new BBB( this ); } // デストラクタ ~AAA(){ delete b; } // メンバ変数 BBB *b; int i; // メンバ関数 void displayB(){ b->displayA(); } }; class BBB { public: // コンストラクタ BBB( AAA *a ){ this->a = a; } // デストラクタ ~BBB(){} // メンバ変数 AAA *a; int j; // メンバ関数 void displayA(){ printf( "%d\n", a->i ); } }; int main() { // 変数の定義 AAA a; // 変数の初期化 a.i = 2; a.b->j = 5; // 出力 printf( "%d\n", a.i ); a.b->displayA(); return 0; } -----------------------------------

  • 【至急!】C++について

    次のプログラムを実行したときに、ユーザーから入力させた「お客さん(Custooor)」の「名前(name)」が、途中で消えてしまいます。 (練習用なのでcharなどを使っていますがご了承を。) どうしたいいですか? #include <stdio.h> #include <cstring> #include <cstdlib> #include <ctime> /*_________________________ Customer _____________________________*/ class Customer { char name[200]; int gankodo; public: Customer(void){} void Whats_Your_Name(void) { printf("あなたの名前を入力:"); scanf("%s",name); } void How_Your_Gankodo(void) { printf("あなたの頑固度(0~100)を入力:"); scanf("%d",&gankodo); if (!(gankodo >= 0 && gankodo <= 100)) { printf("値が間違っているようです。\n"); How_Your_Gankodo(); } for(char c;(int)c!=10 && c!=EOF;c=getchar());//getchar(); /////////////////////////////// /*Customer instan1; instan1.Whats_Your_Name(); instan1.How_Your_Gankodo(); instan1.Kakunin(); *//*┐ printf("\n確認しました。\n"); printf("名前:%s\n", instan1.Whats_Your_Name()); printf("頑固度:%d\n", instan1.How_Your_Gankodo());*/ } void Kakunin(void) { printf("\n確認しました。\n"); printf("名前:%s\n", name); printf("頑固度:%d\n", gankodo); printf("[Enter]\n"); } void Serif(void) { printf("\nむかしむかしある所に、%sが家から飛び出してきました。\n", name);} void Serif2(void) { printf("%s:「頼む一生のお願いだ・・・!\"エアコンの風を自由に操るシステム\"を作ってくれ!」\n", name);} void Serif3(void) { printf("%s:「そんなことはどうでもいいっ!」\n", name);} void Serif4(void) { printf("%s:「いま言ったぞ!聞いていなかったのかっ?!」\n", name);} void Serif5(void) { printf("%s:「・・・」\n", name);} char *output_customer_name(void) { return name;} int output_customer_gankodo(void) { return gankodo;} }; /*_______________________ Sales_staff ___________________________*/ class Sales_staff { char name[200]; public: Sales_staff(void){ strcpy(name, "見波さん");} void Serif(void) { printf("営業者:「はじめまして。私は%sです。」\n",name);} void Serif2(void) { printf("営業者:「何かご注文ですか?」\n");} void Serif3(void) { printf("営業者:「はっはっはっはっはっは」\n"); for(char c;(int)c!=10 && c!=EOF;c=getchar()); printf("    「ご冗談を。」\n");} }; /*_________________________ House ___________________________*/ class House { char name[200]; public: House(void){ strcpy(name, "家");} void story(void) { printf("■ここは\"%s\"です\n",name); Customer okyaku; okyaku.Whats_Your_Name(); okyaku.How_Your_Gankodo(); okyaku.Kakunin(); getchar(); okyaku.Serif(); getchar(); printf("会社につくなり汗だくになりながらこう叫びました。\n"); getchar(); okyaku.Serif2(); //for(char c;(int)c!=10 && c!=EOF;c=getchar()); getchar(); printf("どうやらエアコンの設置場所が悪く、涼しい風が全くこない様子でした。\n"); } }; /*___________________ SystemConsultant_Com ___________________*/ class SystemConsultant_Com { char name[200]; public: SystemConsultant_Com(void){ strcpy(name, "システムコンサルティング会社");} void story(void) { getchar(); printf("■ここは\"%s\"です\n",name); Sales_staff eigyoman; Customer okyaku; getchar(); eigyoman.Serif(); getchar(); okyaku.Serif3(); getchar(); eigyoman.Serif2(); getchar(); okyaku.Serif4(); getchar(); eigyoman.Serif3(); getchar(); okyaku.Serif5(); printf("・・・そういうわけでお客からもらった案件を\n営業者の営業マンは、経営者のヒデアキ社長に伝えました。"); } }; /*********************************************************************/ // intMain /*********************************************************************/ int main(void) { House instant1; instant1.story(); SystemConsultant_Com instant2; instant2.story(); }

  • C++を使ってのテイラー展開

    C++を使って,sinとcosのテイラー展開をしたいのです。 プログラムを作ってはみたのですが,こんな感じでよろしいのでしょうか? #include<stdio.h> int main(void) {  int i,n;  double xb,x,sinx=0,cosx=0,hu;  xb=1.0;  hu=1.0;  printf("どこまで計算しますか?");  scanf("%d",&n);  printf("xはいくらですか?(1以下!)");  scanf("%lf",&x);  for(i=1;i<n;i++)  {  xb=xb*(x/i);  if(i%2==0)  { sinx=sinx+(hu*xb); hu=hu*(-1.0); }  else  { cosx=cosx+(hu*xb); hu=hu*(-1.0); }  }  if(i%2==0)  { printf("答え:%f\n",sinx); }  else  { printf("答え:%f\n",cosx); }  return 0; }

  • C++

    今、下のようなプログラムを作っています #include <iostream> #include <iostream> using namespace std; int i=0, c=0, n; char str[10]; class X16karax10{ //16進から10進ヘ public: void keisan(); }; void X16karax10::keisan(void){ cout<<"16進を入力して下さい"<<endl; cout<<"英数字は大文字で入力してください(F→○ f→×)" <<endl; scanf("%s",str); while(str[i] != '\0'){ n = n * 0x10; c = str[i++]; if((c >= '0') && (c <= '9')){ n += c - '0'; } else if((c >= 'A') && (c <= 'F')){ n += c - 'A' + 10; } } cout<<("%d\n",n)<<"です\n"<<endl; } int main(){ for(i=0; ; i++){ X16karax10 p; p.keisan(); } } 16進を十進に変えるものなのですがreturn 0を使うと「X16karax10::keisan()' は値を返せない」と、でてしまうのですがどうしたらよいでしょうか?

  • 【C++】アドレス演算子について質問です。

    アドレス演算子について質問です。 下記のように"&"を関数名の前に付けた場合下記のように出力されます。 &グローバルメソッド:002E1226 &クラス::メンバメソッド:1 1行目はグローバルメソッドなので実態が存在するのでメソッドのアドレスが表示されている。 2行目は実態が存在しないと思うのですが、あってますでしょうか? また、何故1が表示されてしまうのでしょうか? -------------------------------------------------------- #include "stdafx.h" #include <iostream> using namespace std; class Class1{ public: void f(){ return; } }; void Func1(){ return; } int main() { cout << "&グローバルメソッド:" << &Func1 <<endl; cout << "&クラス::メンバメソッド:"<< &Class1::f <<endl; getchar(); return 0; }

  • typeid演算子を使用すると警告される

     解決方法が分からないのでここで質問することにしました。 typeid演算子を使っていて途中から、警告されるのですが、無視してデバックを行うと途中からERRORになり、中断しました。  警告内容は、 (warning C4541: 'typeid' が /GR- を使用したポリモーフィック型 'Kitty' で使用されています; 動作結果は保証されません。) というもので、まず下記のソースを読んでもらいたいのですが #include<iostream> #include<typeinfo> using namespace std; class Kitty { public: virtual void func() {} ; } obj1; class Chobits : public Kitty { public: void func() {} } obj2 ; int main() { Kitty *po = &obj1; cout << "Class type = " << typeid (*po).name() << '\n'; po = &obj2; cout << "Class type = " << typeid (*po).name() << '\n'; return 0; } のmain()内のtypeid演算子が原因のようなのですが、解決方法がよく分かりません。プラットフォームはVS.NET2003でC++で記述しています。 ちなみにERROR内容は、sample55.exe の 0x7c812aeb でハンドルされていない例外が発生しました : Microsoft C++ exception: __non_rtti_object @ 0x0013fdb4。というものです。  

専門家に質問してみよう