C++初心者がクラスの継承について質問

このQ&Aのポイント
  • C++初心者がクラスの継承について質問しています。 Visual C++ 2008で新しいwindowsフォームアプリケーションを作成した際に、Form1.hにあるpublic ref class Form1 : public System::Windows::Forms::Formという行の意味を知りたいとしています。
  • Form1クラスはSystem::Windows::Forms::Formクラスを継承して新たに作成されるものであり、継承の仕方を示しています。
  • また、ref classというキーワードはポインタのような意味合いを持ち、このキーワードを省略すると別の継承方法になることを説明しています。
回答を見る
  • ベストアンサー

C++を勉強し始めたばかりの初心者なのですが、クラスの継承に関して・・・

Visual C++ 2008で、新しいwindowsフォームアプリケーションを作成したら、Form1.hの上の方に public ref class Form1 : public System::Windows::Forms::Form という行がありました。これは開発環境に実装されている System::Windows::Forms::Formクラスを継承し、Form1クラスを新たに作成しますという意味なのですよね? このとき、2つ目のpublicは、継承の仕方、この場合結果的にはSystem::Windows::Forms::Formクラスに含まれるメンバの、private以外がそのまま受け継がれる、という事になりますよね? それで、このref classというのは、ポインタみたいな意味でしょうか?refは書かないと別の継承方法になるのでしょうか? また、最初のpublicはどういう意味なのでしょう? もしかして、この2つについては、System::Windows::Forms::Formクラスを継承して新規フォームを作る場合の、定型みたいなものなのでしょうか?

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

最初のpublicはこのプロジェクトにForm1クラスを公開するのに必要です refは一般的なC++の構文にはありません これは C++/CLIという特殊な環境で使う構文です C++/CLIでは オブジェクトをポインタ扱いで使いますのでForm1クラスの実体をオブジェクトのを ^記号付で表します Form1^ obj; などといった宣言をします 一般的なC++のクラス宣言なら public class Form1 : pulic System::Windows::Forms::Form といった具合に記述します Form1のオブジェクトを宣言する場合 Form1 obj, *pObj; といった具合になります objは実体、pObjはポインタ といった具合です

LongSecret
質問者

お礼

なるほど! ^記号までつながりがあるとは驚きました。 ご丁寧にありがとうございます。 ^記号といえば、メインプロジェクトファイルに int main(array<System::String ^> ^args) って書いてありましたが、このように右側の文字につく場合はどういう意味があるのでしょうか? また、この()内全体はどういう意味なのでしょうか?

その他の回答 (1)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

変数などの左側に書くか、変数の型の右側に書くかはいろいろあります 変数の右側に書いたほうが直感的になると思います たとえば char *pbuf, ch; と char* pbuf, ch; と書いた場合 chの型を初心者の方は読み間違える可能性があります どちらの構文も chは char型ですが ・・・ 間違われないように char* pbuf; char ch; などと明示的に行を変えるといった方法もあります

LongSecret
質問者

お礼

内容としては同じというわけですね。 ありがとうございました。

関連するQ&A

  • C++でのwindows フォームアプリケーションについて

    最近フォームアプリケーションでの開発を始めたのですが、 public ref class Form1 : public System::Windows::Forms::Form から #pragma region Windows Form Designer generated code の間に記述されている内容がサンプルコードを見たりしても理解できません。 どのような時に呼び出されて、どのような意味があるのでしょうか 以下、参考にさせてもらったサンプルコード public ref class Form1 : public System::Windows::Forms::Form { protected: msCDXMain* m_pDXMain; BOOL m_bStart; public: Form1(void) { InitializeComponent(); InitDX(); m_bStart = FALSE; // //TODO: ここにコンストラクタ コードを追加します // } protected: /// <summary> /// 使用中のリソースをすべてクリーンアップします。 /// </summary> ~Form1() { if (components) { delete components; } } private: System::Windows::Forms::Button^ button1; private: System::Windows::Forms::Timer^ PaintTimer; protected: private: System::ComponentModel::IContainer^ components; private: /// <summary> /// 必要なデザイナ変数です。 /// </summary> BOOL InitDX(void) { m_pDXMain = NULL; try{ m_pDXMain = new msCDXMain; if(!m_pDXMain->Init((HWND)this->Handle.ToInt32())){ SAFE_DELETE(m_pDXMain); throw 0; } } catch(...){ return FALSE; } return TRUE; }

  • クラスの設計の問題

    今C++でクラスの設計をしています。 どう設計すれば、いいか分からないので、しっている方に教えていただきたいですが。 class A{ private: int id; public: int getId(); void setId(); }; class B{ private: int id; public: int getId(); void setId(); } class C{ private: int id; public: int getId(); void setId(); } この三つのクラスが、共通な機能があります。また、実装も同じで、 継承を利用して、どう設計すれば、いいですか? よろしくお願いします。

  • 継承後のメソッドでコントロールにアクセスする方法

    よろしくお願い致します。 継承の動作を勉強しております。動作自体は確認出来ました。 継承後のメソッドでフォーム上のコントロールにアクセスする方法はありますか? 例えば「label1.text = "~"」の様に動作させたいです。 現在、2つのファイルに3つのクラス(そもそもここが間違ってる?)を書いてあります。 ----- 1つめのファイル(Formのクラス) ----- Public Class Form8  Private Sub Button1_Click(~) Handles Button1.Click   Dim c As New check1   c.test()  End Sub End Class Public Class check1  Inherits Class1  Public Overrides Sub test()   Trace.WriteLine("Overrides")   'label1.text = "動作OK"   ←こんな感じに実装したい  End Sub End Class ----- 2つめのファイル(クラス) ----- Public MustInherit Class Class1  Public MustOverride Sub test() End Class フォームクラスの外で「label1.text = ""」のように書いてもアクセス出来ないのはわかります。 フォームクラスのファイル中にもうひとつクラスを書いてしまっているのが悪いのもわかります。 この辺りをどのように実装したらよいでしょうか。 わかりづらくて申し訳ありません。 ご指導よろしくお願い致します。

  • private継承はどう使う?

    C++の話です class Base{.....}; class Derived1 : public Base{.....}; class Derived2 : private Base{.....}; と書くことができますが、public継承とprivate継承にはそれぞれ意味がありますよね。 public継承は"is-a"関係を意味していて、private継承は "is-implemented-in-terms-of"関係を表していると言います。 public継承を実際に動くプログラムは思いつくのですが、private継承を使ったプログラムが思いつきません(というより有効に使えません) 派生クラスから呼び出せない、外部からも呼び出せないメンバをどう使うのでしょうか?

  • MessageBoxを継承したい

    C#2.0を使用しています。 MessageBoxを継承して拡張させたいと思い、MessageBoxExなるクラスで 次のように記述したのですが public class MessageBoxEx : System.Windows.Forms.MessageBox { } 型 'System.Windows.Forms.MessageBox' のコンストラクタが定義されていません。 というエラーが出てしまいます・・・ これはどういうことなのでしょうか? コンストラクタが定義されてないクラスは継承できないのでしょうか?

  • 抽象クラスが継承されているかどうか検証したい

    Class.forName()にて取得したクラスが、特定の抽象クラスを継承しているかどうかを 検証したいです。 Class.getInterfaces()にて、実装されているインターフェースを取得することが出来ましたが、 Class.getClasses()、Class.getDeclareClasses()のいずれでも、継承されている 抽象クラスを取得することが出来ません。 そもそも抽象クラスはインスタンス化できないからなのかもしれませんが、 ならば、その抽象クラス名称を取得したいです。 方法はありますでしょうか? 無理ならばインターフェースの実装にし、基盤部で動作のカバーを する作りで考え直すつもりです。

    • ベストアンサー
    • Java
  • VC2010プログラミング

    formの中に自作のクラスを定義して使用したいのですが、どこに定義すればよいのかわかりません。 #pragma once #include "XXX.h" namespace FileRename { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; /// <summary> /// Form1 の概要 /// </summary> public ref class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); // //TODO: ここにコンストラクター コードを追加します // } protected: /// <summary> /// 使用中のリソースをすべてクリーンアップします。 /// </summary> ~Form1() { if (components) { delete components; } } private: System::Windows::Forms::Button^ button1; XXX^ instance = gcnew XXX(); protected: private: /// <summary> /// 必要なデザイナー変数です。 /// </summary> System::ComponentModel::Container ^components;   ・   ・   ・ } XXXクラスはこの場所で定義するのは間違いなのでしょうか?

  • 継承したクラスを、継承元のクラス型の引数に渡すとどうなるのでしょうか?

    継承したクラスを、継承元のクラス型の引数に渡すとどうなるのでしょうか? 以下のようなケースで、 #include "stdio.h" using namespace std; // baseクラス class base { private:  int m_nII;  int m_nJJ;  int m_nKK; public:  base(int i,int j,int k){ m_nII=i; m_nJJ=j; m_nKK=k; }  int GetSum(){ return (m_nII+m_nJJ+m_nKK); } }; // base 継承クラス class hoge : public base { public:  hoge() : base(1,2,3){} }; void func(base* obj){ // baseクラスを引数に取る関数  printf("sum is %d\n", obj->GetSum()); } // main int main(){  hoge objHoge;  func((base*)&objHoge); // <-キャストして渡す  return 0; } として、一応、gccでコンパイルは通り、実行結果も期待通りだったのですが、 このやり方で問題は無いのでしょうか? (たとえば継承先のクラスが独自のメンバを持っていたりなどした場合、期待した結果にならないとか・・) よろしくお願いします。

  • フォームのテキストコントロールへの出力

    Cは分かりますが、C++初心者です。 よろしくお願いします。 namespace sample1 外にある関数から、フォームのコントロールにアクセスするには、 どうしたらいいのでしょうか? ========================================================== #pragma once void DspData( ReadData *readdata ); //コールバック関数宣言 namespace sample1 { using namespace System; using namespace System::ComponentModel; using namespace System::Collections; using namespace System::Windows::Forms; using namespace System::Data; using namespace System::Drawing; public __gc class Form1 : public System::Windows::Forms::Form { public: Form1(void) { InitializeComponent(); } protected: void Dispose(Boolean disposing) { if (disposing && components) { components->Dispose(); } __super::Dispose(disposing); } private: System::Windows::Forms::Label * label1; private: System::Windows::Forms::Button * start; private: System::Windows::Forms::Button * end; public: System::Windows::Forms::TextBox * textBox1; private: System::ComponentModel::Container * components; void InitializeComponent(void) { } private: System::Void start_Click(System::Object * sender, System::EventArgs * e) { } }; } //------------------------------------------------ // DspData //------------------------------------------------ void DspData( ReadData *readdata ) { //***↓ここでフォームのテキストボックスへの表示を行いたい。***** textBox1->set_text("ここで出力") return; } ==========================================================

  • インタフェイス実装と抽象クラス継承を同時に使うには??

    私はjava初心者です、今練習問題で困っています。 1つのクラスに抽象クラスとインターフェイスを 実装することはできるのでしょうか? 例えば abstract class Car { private String gas; public void getGas(int gas) { this.gas = gas; } public abstract void enjin(); } interface Flying extends Pet { void show(); } 上のインタフェイスと抽象クラスを同時に下のクラスに継承、実装しよう とすると、どんな風にかけば良いのでしょうか class Zoon { public Zoon() { super(); } public void enjin() { System.out.println("どどどどど"); } public void show() { System.out.println("いいくるまだ"); } }

    • ベストアンサー
    • Java