• 締切済み

基底クラスと派生クラスがわかりません

javascriptを勉強してるんですが基底クラスや派生クラスという言葉がでてきます よくわかりません(´;ω;`) 教えてください!お願いします!

みんなの回答

  • Ogre7077
  • ベストアンサー率65% (170/258)
回答No.2

JavaScript にクラスは無いので、C++/Java の様にクラスっぽい何かを実現して、コーディングを楽にさせようという、一部の技術者が使う隠語ではないかと推測します。 例を書いてみました。 /** 基底クラスの様な何か. */ function Man() {} Man.prototype.punch = function() {/*パンチを繰り出す処理*/}; Man.prototype.think = function() {/*ものすごい長い処理*/}; /** 派生クラスの様な何か. */ function UltraMan() {} UltraMan.ptototype = new Man(); // 基本的に Man と同じ UltraMan.ptototype.beam = function() {/*新必殺技の処理*/}; /** 派生クラスの派生クラスの様な何か. */ function SuperUltraMan() {} SuperUltraMan.prototype = new UltraMan(); // 基本的に UltraMan と同じ SuperUltraMan.prototype.punch = function() {/*強いパンチを繰り出す処理*/}; var mans = [ new Man(), new UltraMan(), new SuperUltraMan() ]; // Man 達に同じ命令をする mans.forEach(function(man){ man.think() }); // クラスの凡化を実現 mans.forEach(function(man){ man.punch() }); // クラスの多様性を実現 // Man 達の中から特定のクラスに分類される Man を抜き出して、同じ命令をする mans .filter(function(man){return man instanceof UltraMan}) .forEach(function(man){ man.beam() }); // UltraMan に分類されるなら実行できる処理 しかし JavaScript はあくまでもプロトタイプベースのオブジェクト指向言語ですので、この方向に深入りすると危険です。あくまでも、こんな書き方もできる程度の軽い気持ちでいてください。

  • shiren2
  • ベストアンサー率47% (139/295)
回答No.1

入門レベルのjsで習うんですか。 時代も変わったものですね。 基底クラスとは親クラス、派生クラスとは子クラスのことです。 継承の元になったクラスを親(ベース)、機能(メソッド)を継承したクラスを子と呼びます。 車(ベース)から派生してパトカーや消防車ができたようなものです。

関連するQ&A

  • 派生クラスのメンバを基底クラスの参照に代入(C++

    文末のコードのように、 基底クラスで、派生クラスのメンバの参照を持つのはまずいでしょうか。 (classではなくstructにしているのは質問上でのpublic:の省略のためだけです) 初期化順序的には、基底クラスの参照先は、 基底クラスのコンストラクタが走る時点で初期化されていないので、 コンストラクタ内で参照に対して何かしようとすると問題になると思っています。 基底クラスのコンストラクタ内で派生クラスメンバの参照に対して何かしなければ、 参照は有効で、派生クラスのコンストラクタ実行後であれば 問題なく動くと思ってよいでしょうか。 struct A { int& m_ref; A(int& ref) : m_ref(ref) { } }; struct B : public A { int m_obj; B() : A(m_obj) { } };

  • 派生クラスを含む配列について

    VisualStudio.NETの開発経験があまり無い者です。 WEBサービスを使った開発をするのですが、 対象のメソッドの引数に、特定のクラスの配列を指定するようになっているのですが、 実際にこの引数には、そのクラスの派生クラスのいずれかが入るような感じになっています。 例:ABC(X[]) 引数Xは基底クラスの配列。でもここにはXの派生クラスYやZなどが入る このような場合の実際の指定方法がわかりません。 どのようにしたらよいのでしょうか?

  • 派生クラスはプロパティを継承するとは

    派生クラスはプロパティを継承するとはどういうことでしょうか? AbstractButtonクラスの派生クラスとは? 派生クラスはnemonicというプロパティを継承するとは? プログラミング用語でいう「派生クラス」と「プロパティの継承」の意味を簡単に噛み砕いて、教えてください。

  • 仮想基底クラスをもつクラスの代入演算

    仮想基底クラスをもつクラスの代入演算で、仮想基底クラスの代入が各々のサブオブジェクトにつきただ一回なされるようにしたい場合に、みなさん、どのように設計されていますか? 何か、手軽なテクニックがあれば、ご教示ください。 ===(コンストラクタなどは略、アクセス制御も略) たとえば、 struct X { int x; }; struct A : virtual X { int a; }; struct B : virtual X { int b; }; struct C : A, B { int c; }; int main() { C c1, c2; c1 = c2; } として、デフォルト代入に頼ると、c1.x への c2.x の代入を複数回行うコンパイラが多いですよね(というか、きっちり1回のみ行うようにしているコンパイラに出会ったことがない)。C++標準でも、初期化はただ一度とコンパイラが保証するようになっていますが、代入は何度代入してもいいようになっていたと思います。 以下のように、各クラスで、直接の非仮想基底クラスと自身のデータメンバにのみ代入するメンバ関数を定義して、最派生クラスでのみ、仮想基底クラスの代入を行うのが、普通のやり方なんでしょうか。 これでもいいのですが、後に、ある基底クラスに仮想クラスが付け加わったりすると、その基底クラスから派生しているクラスの代入演算の定義をすべていじらないといけなくなるので、もっといいテクニックがあるのなら、と思いまして質問したしだいです。 struct X { int x; X &nvAssign(const X &z) { x = z.x; return *this; } X &operator=(const X &z) { nvAssign(z); } }; struct A : virtual X { int a; A &nvAssign(const A &z) { a = z.a; return *this; } A &operator=(const A &z) { X::nvAssign(z); return nvAssign(z); } }; struct B : virtual X { int b; B &nvAssign(const B &z) { b = z.b; return *this; } B &operator=(const B &z) { X::nvAssign(z); return nvAssign(z); } }; struct C : A, B { int c; C &nvAssign(const C &z) { A::nvAssign(z); B::nvAssign(z); c = z.c; return *this; } C &operator=(const C &z) { X::nvAssign(z); return nvAssign(z); } }; === 1. 仮想基底クラスは何度代入されてもいいようにするもんだ。 2. 仮想基底クラスにデータメンバを持たせるのは間違いだ。 3. 遅くなるから、そもそも仮想基底クラスなど使わない。 という回答は無しでお願いいたします。たぶん、1 か 2 が正解なんでしょうけど^^

  • 多態性を利用して派生クラスの関数を呼びたい

    環境はVS2013,言語はC++です. 基底クラス側で,基底クラスのポインタを引数に受ける仮想関数を宣言し, 派生クラスでその実装をします. 派生クラス側で引数に派生クラスのポインタを受けて,派生クラスのメンバにアクセスできるようにしたいのです. 作成したサンプルを下記に示します. Hello()は関係ありません. また,これはあくまで簡略化したサンプルなだけなので,thisポインタからメンバにアクセスすればよいというものではありません. #include <iostream> class Base { public: int i; Base() :i(0) {} virtual void print(Base *p) { std::cerr << "Base : " << i << std::endl; } virtual void hello() = 0; }; class Super : public Base { public: int x; Super() : x(1) {} void print(Super *p) { std::cerr << "Super : " << p->x << std::endl; } void hello() { std::cerr << "hello" << std::endl; } }; int main(void) { Base *p; p = new Super; p->print(p); } 上記を実行した結果,Base::print()が呼び出されました. print関数の引数に派生クラスSuperの実態を差すBase型ポインタを与えたときに,Super::print()を呼び出せるようにするには,何か方法はありますか. p->print(p)の呼び出し部分をp->((Super*)p)にキャストしても結果は同じくBase::print()が呼ばれました. Base::print()の実装を無くした場合は,未解決の外部参照のコンパイルエラーが発生し, Base::print()を純粋仮想関数にした場合は,Super側でSuper::pirnt(Base*p)を実装しなければならないのか,抽象クラスのインスタンス化ができないというコンパイルエラーが発生します. これは,派生クラスとはいえ,引数リストの型が違うのでオーバーライドされていないということですよね. 引数をBase *p,Super *pからそれぞれvoid *pへ変更し,Super::print()内で(Super *)へキャストしなおしたところ,きちんとオーバーライドされ,うまくはいきました. しかしながら,この方法だと派生クラス側で実装する際に毎回キャスト処理を書かなくてはなりません. 他に何かきれいな方法はないでしょうか.

  • 自作のクラスの基底クラスは何を使えばよいのでしょうか?

    VC2005のウィザードを使うとで枠は作られるので、そこまでは問題なくえきました。 MFCでは関数でなくクラスを作成して、それを使いまわすというやり方のようなので 今度、自作のクラスの作成したいのですが 基本クラスを選択しようとすると、たくさん出てきまして、どれを選択したらよいか判断付きません。 クラス名は、テストなのでCTestとしますが、 画面など他から拡張するクラスを作るのではなく、以前作成した関数の集まり程度のものなので、シンプルな基底クラス(というのでしょうか?)から作成したいです。 何を選べば一般的でしょうか? 作成したクラスの使い方(宣言の仕方など作法)について詳しく書かれている本をご存じ方も教えて下さい。

  • 構造体からクラスを派生させる方法

    実は今大学に通っていてC++の授業を取っているのですが、この間構造体からクラスを派生させると言う部分の講義があったんです。ですがその回、都合で欠席してしまい方法が分かりません。周りの学生に聞いてもよく分からず本等で調べても構造体から派生させる所は載っていませんでした。どなたか「構造体からクラスを派生させる方法」を知っていたら教えて下さい(私の予想では基本クラス名を書く所を構造体名にすればいいのだと思うのですが)普通にクラスから派生させる時との違いや注意点等も分かりましたらお願いします。 まだ習い始めたばかりなので幼稚な質問になってしまったかもしれませんがよろしくお願いします。

  • 基本クラスのポインタで、派生クラスのメンバ関数を呼び出す方法?

    VC++でプログラミングをしています。 A(基本クラス) B(派生クラス) を作成しました。Bは、Aの特別な場合です。 このとき、基本クラスAのポインタから、派生クラスBにのみあるメンバ関数を呼ぶことはできないのでしょうか? 基本クラスAにも同じ名前の関数があれば、仮想関数をオーバーロードすれば呼び出せるようですが、この関数は、基本クラスには不要なので、できれば使わないメンバ関数を基本クラスに書きたくありません。 (純粋仮想関数という方法もあるようですが、) 操作としましては、 Aのポインタ配列 A* a[100]を作成し 特別な場合のみ派生クラスBのメンバ関数だけを実行させたいのです。 派生クラスにのみあるメンバ関数を、Readとします。 for(i=0;i<100;i++){ if(派生クラスBの場合){ a[i]->Read() } } 現状では、コンパイルエラーで、 関数Readは、aのメンバ関数ではありませんとなってしまいます。 以上よろしくお願いします。

  • 複数の派生クラスオブジェクトを一括して取り扱う方法

    いつもお世話になっています。 C++でプログラムをしています。 classAの派生クラスとして、 classA-1、classA-2を作りました。 classAのオブジェクトには、 親クラスにおいて、重複しないIDを 定義しています。 classA{...} classA-1():public A classA-2():public A classA-1 A1[1000]; classA-2 A2[2000]; ここで、クラスAオブジェクト (派生クラスを含む)のうち、 特定のIDのオブジェクト、 例えば、ID=100番のものを 取り出して、何某かの処理をしたいのですが、 現在は、 for(i=0;i<1000;i++){ if(A1[i] == 100){...} } for(i=0;i<2000;i++){ if(A2[i] == 100){...} } のようにしています。 しかし、派生クラスの種類が増えてくると、 この方法はコーディング量が非常に増えて 非効率的です。 プログラム上も美しくありません。 できれば、 同じクラスなのですから、 for(i=0;i<1000;i++){ if(A[i] == 100){...} } のような形で一括して検索するようにしたいのです。 つまり1つの配列変数で 両方を扱えるようにしたいのです。 ただし、当該IDを持つ、ポインタさえ取得できれば、 それぞれの派生クラスに型キャストしてから 操作するつもりです。 target = (classA-2)A[5]; target.Action(); どなたか、参考URL、キーワード、アドバイス等 頂ければ助かります。 よろしくお願いします。 よろしくお願いします。 としており、効率的ではなくなってしまいます。

  • 基本クラスのポインタから、特定の派生クラスのメンバ変数を変更する方法?

    VC++でプログラミングをしています。 A(基本クラス) A1, A2, A3, ...(派生クラス) を作成しました。A1,A2,A3, ...は、Aの派生クラスです。 このとき、基本クラスAのポインタから、特定の派生クラスにのみ存在するメンバ変数m_dataのみ変更したいのですが、存在するかどうかをどのように判定して、値を変更すれば良いでしょうか? できれば、下記のような構造でループできるとありがたいです。 A* a[100] (その後、a[100]に、派生クラスA1,A2,A3,..を割り当て、  それらが、混在しているとします。) for(i=0 ; i<100 ; i++){ if(a[i]->m_dataが存在する場合){ (2)   a[i]->Set_m_data("m_dataの新しい値") (1)  } } (1)は、a[i]->m_data = "m_dataの新しい値" でも良いです。 現状では、m_dataがメンバでない派生クラスがあるので、 (2)のif文の判定自体ができず困っています。 よろしく御願いします。

専門家に質問してみよう