• ベストアンサー

【C++】継承しながら、インプリメント。

VB.netでは、以下のように継承しつつ実装ができると思いますが、 (1)C++ では、できないのでしょうか? (2)Java では、できないのでしょうか? Class SampleClass Inherits BaseClassHoge Implements InterfaceFoo また、 Implements は、Javaでは可能ではありますが、 C++ には「Implements」はないのでしょうか? (C++ では純粋仮想関数の集合となるアブストラクトクラスを継承するという方法しかできないのでしょうか?) .

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

  • ベストアンサー
  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.2

>C++やJavaも「ない」です。 いったい何を参照して「ない」となったんですか? C++やJavaの言語仕様にないのであれば、処理系の独自実装でもない限りありません。 (1)できないので多重継承で代用して。 (2)できます。

TeferiMage
質問者

お礼

ありがとうございます。 題意の件、特にc++で可能かを調べておりまして、googleで、 extends impliment C++ interface などなどの組み合わせて調べていたのですが、調べ方が下手なだけみたいですね。

その他の回答 (4)

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.5

>題意の件、特にc++で可能かを調べておりまして、googleで、 extends impliment C++ interface などなどの組み合わせて調べていたのですが、調べ方が下手なだけみたいですね。 言語仕様を調べるなら言語仕様書を探すべきでは? ISO C++だと http://www.iso.org/iso/iso_catalogue/catalogue_ics/catalogue_detail_ics.htm?ics1=35&ics2=60&ics3=&csnumber=50372 とか(買わないと読めませんが・・・)、JISだと http://www.jisc.go.jp/app/pager?%23jps.JPSH0090D:JPSO0020:/JPS/JPSO0090.jsp=&RKKNP_vJISJISNO=X3014 とか(C++03ですが) javaは http://docs.oracle.com/javase/specs/index.html ちなみにC++でinterfaceと同等の事をするのに多重継承をすすめてるわけじゃありません。それくらいしか方法がないってだけです。

TeferiMage
質問者

お礼

ありがとうございます。 言語仕様書、少し探してみました。 この辺もよさそうです。 【C++】 http://vene.wankuma.com/ecma372/StartingState.aspx 【Java】 http://www.y-adagio.com/public/standards/tr_javalang/index.htm .

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

何となく、理念と実装を混同している気がするのですが、私の気のせいでしょうか。 元のコードをどこまで再現できるかについては、何が必要で何が必要ではないかを明確にしなければなりません。 VB.netで書かれたコードをそのままの意味でマッピングすることが必要であれば... (1) できません。ただし... VB.netが何をさすのかにもよりますが、Visual Basic.NETまたはVisual Basic.NET 2003の意味であれば、Managed C++なら同じことができます。 Visual Basic 2005以降を指すのであれば、C++/CLIで同じことができます。 言語名ではなく製品名ですが、Visual C++で同じことができるという言い方もできないわけではないかと思います。 (2) できません。 Javaは.NET Framework上で動作するプログラムを開発するためのものではないからです。 J#ならできますが、最新のVisual StudioはJ#はサポートしていません。 .NET Framework上で動作するプログラムを作成できるかどうかではなく、単にそのような継承関係を記述できるかどうかであれば、すでに回答が出ている通りです。 C++の純粋仮想関数を多重継承するのはVBのインタフェース継承と同じではありませんが、同じ理念を実装する手段としては十分役目を果たすものです。 また、C++ではTraitsやPolicyを使うことで、静的なインタフェース継承の理念を実装することもできます。

TeferiMage
質問者

お礼

ありがとうございます。 目的としては、下でいう(2)の方です。 (1).NET Framework上で動作するプログラムを作成できるかどうか (2)継承しながら、インプリメントする「関係」を記述できるかどうか 自分は知らなかったのですが、 .NET Frameworkの共通言語基盤 (CLIでしたっけ?)として、共通言語ランタイム上で動くC++と、 そうでないC++があるのですね。 Traitsで「データ型」をパラメータにしたり、 Policyで「処理」を切り替えたりというのも、 状況に応じて使いたいと思います。 .

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

オブジェクト指向の「歴史」的には「多重継承で代用」は筋がずれてるはずなんだけどね.... ちなみに Java では inherit じゃない.

TeferiMage
質問者

お礼

ありがとうございます。 (Extendsと書くのは存じ上げていたのですが、vbの例で書かせて頂いておりました) 題意の件、特にc++で可能かを調べておりまして、googleで、 extends impliment C++ interface などなどの組み合わせて調べていたのですが、検索結果からは c++ではinterfaceがない?と受け取りました。 (調べ方が下手なのかもしれませんが・・・) なので、抽象クラスで代用になるのかな?とは思っていたのですが、 「メンバ変数、メソッドの継承」と「実装して欲しいメソッド群(インタフェース)の指定」は、別物にしたいのです。 多重継承したとき、それがインタフェースとして、メソッドの実装をさせるためなのか、それとも変数・メソッドを継承させたいのか、 不明瞭な書き方はしたくないのです。 私もで多重継承での代用は避けたいと考えています。

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.1

C++やJavaの言語仕様を調べればわかる事だと思いますけど・・・調べないんでしょうか。

TeferiMage
質問者

お礼

C++やJavaも「ない」です。 しかし「見つからない」のか、 本当に「ない」のかわかりかねます。 「継承」と「実装強制」は別の用途で使うので、 ないとは思えないのです。 .

関連するQ&A

  • 継承・実装の関係で悩んでいます。

    継承・実装の関係について悩んでいます。 ここでは、アクセス制御を考えずに、インスタンスかstaticかabstract(ここではabstract final staticやabstract classのこと)の違いで、どう継承するのか考えています。 // 継承 はメソッドのオーバーライドのことを考えます。(オーバーロードは考えない) クラスAからクラスBでオーバーライドしたメソッドは、 クラスCでさらにオーバーライドできるのでしょうか? クラスCが クラスBのクラスAからオーバーライドしたメソッド をクラスBのメソッドとして見たときに、オーバーライドすることは可能なのでしょうか? クラスA │ インスタンスフィールドA │ staticフィールドA │ │ クラスA() { } │ │ インスタンスメソッドA () { } │ staticメソッドB() { } ↓ クラスB extends クラスA │ インスタンスフィールドA // 継承 │ インスタンスフィールドB │ staticフィールドB │ │ サブクラス1() { } // コンストラクタは継承しない、super()で呼び出す │ │ インスタンスメソッドA () { } // 継承 │ │ インスタンスメソッドB () { } │ staticメソッドB () { } ↓ クラスC extends クラスB implements インタフェースD, ... ↑ インスタンスフィールドA // クラスBのフィールドを継承 │ インスタンスフィールドB // クラスBのフィールドを継承 │ インスタンスフィールドC │ staticフィールドC │ │ サブクラス2() { } │ │ インスタンスメソッドA () { } // クラスBのメソッドを継承 │ インスタンスメソッドB () { } // クラスBのメソッドを継承 │ インスタンスメソッドD () { } // インタフェースDのメソッドを実装 │ インスタンスメソッドE () { } // インタフェースDのメソッドを実装 │ │ │ インスタンスメソッドC () { } │ staticメソッドC() { } │ interface インタフェースD extends インタフェースE ↑ │ staticフィールドD // public static final │ │ インスタンスメソッドD() { } // public abstract │ インスタンスメソッドE() { } // 継承 │ interface インタフェースE staticフィールドE // public static final インスタンスメソッドE() { } // public abstract

    • ベストアンサー
    • Java
  • 継承、実装についてまとめています。この図は正しいですか?

    継承、実装についてまとめています。この図は正しいですか? クラス1 から継承した クラス2のものを、クラス3で継承するのでしょうか? クラス1 │ int a; │ static int b; │ │ クラス1() { } │ │ int methodA () { } │ static int methodB() { } ↓ サブクラス1 extends クラス1 │ int a; // 継承 │ int c; │ static int d; │ │ サブクラス1() { } // コンストラクタは継承しない、super()で呼び出す │ │ int methodA () { } // 継承 │ int methodC() { } │ static int methodD() { } ↓ サブクラス2 extends サブクラス1 implements サブインタフェース1, サブインタフェース2… ↑ int a; // サブクラス1のフィールドを継承 │ int c; // 継承 │ int e; │ static int f; │ public static final int g; // 実装(サブインタフェース1) │ public static final int h; // 実装 │ │ サブクラス2() { } │ │ int methodA () { } // サブクラス1のメソッドを継承 │ int methodC() { } // 継承 │ int methodE() { } │ static int methodF() { } │ int methodG() { } // 実装(サブインタフェース1) │ int methodH() { } // 実装 │ interface サブインタフェース1 extends スーパインタフェース1... ↑ public static final int h; │ │ public abstract int methodE() { } // 継承 │ public abstract int methodH() { } │ interface スーパーインタフェース public static final int g; public abstract int methodG() { }

    • ベストアンサー
    • Java
  • C++で参照カウンタを実装したいのですが

    こんにちは。 C++でクラスに参照カウンタを実装したいのですが、もしも実装する場合、 class CRefCounter {   参照カウンタとAddRef、Releaseメソッドを仮想メソッドとして実装 }; このクラスを継承して直接使う方法と、 class IRefCounter {   参照カウンタとAddRef、Releaseメソッドを純粋仮想メソッドとして宣言 } このクラスを継承して継承側で実装する方法とがあると思うのですが普通はどちらを使うものでしょうか?

  • 抽象クラスの継承について

    すいませんがご教授下さい。 ASP.NETとVB.NETを使用してアプリを開発しています。 存在するクラスは以下のようなクラスです。 (WebForm1.aspxとWebForm1.aspx.vbとClass1.vb(抽象クラス)があります。) したい事はClass1.vbをWebForm1.aspx.vbが継承したいのですが継承させた後にWebForm1.aspxを開こうとすると「Webフォームデザイナにファイルを読み込めませんでした。・・・・」とエラーポップアップが表示されます。「はい」でHTMLは見れるのですがデザインはタブ自体がないです。普通のクラスを継承させると問題ないのですが。抽象クラスだとエラーになります。 対処方を教えて下さい。

  • WebBrowserコントロールを継承するには

    VB.NETで既存のWebBrpwserコントロールを継承して 独自のコントロールを作成せいしたいのですが上手くいきません。 以下、私が実践した手順です。 1.プロジェクトにクラスを追加   →クラス名:CBrowser 2.CBrowserにWebBrowserを継承   →Inherits WebBrowserを記述 3.フォームに既存のWebBrowserを配置 4.Designer.vbを編集   →2箇所のSystem.Windows.Forms.WebBrowserをCBrowserに置き換え このやり方だと、稀にフォームデザイナーがエラーを出してしまいます。 よろしくお願いします。

  • C++の継承と呼び出しについて

    C++について COMとMediaFoundationについて勉強中ですが、継承とオーバーライド の部分で混乱してしまったので、アドバイスをお願いします。 IUnknownクラスは、三つの純粋仮想関数を持っていて、 virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject)=0; virtual ULONG STDMETHODCALLTYPE AddRef(void)=0; virtual ULONG STDMETHODCALLTYPE Release(void)=0; の三つがあることがわかりました。 そのIUnknownクラスを継承したIMFAsyncCallback、 IMFAsyncCallbackをさらに継承したCPlayerクラスがあります。 CPlayerクラスの中でCPlayer::QueryInterfaceの定義・処理が記述されています。 ここで、ほかのCPlayerクラスの関数内で IUnknownのインスタンス->QueryInterface(引数) ; で呼び出された場合、 CPlayer::QueryInterfaceには飛ばないのでしょうか? 何度ブレークポイントを張ってもきていないので、 いったいどこで処理が行われているか不思議で仕方ないです。 というかIUnknownのインスタンスが作れていることすら疑問です。。。 よろしくお願いします。

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

    よろしくお願い致します。 継承の動作を勉強しております。動作自体は確認出来ました。 継承後のメソッドでフォーム上のコントロールにアクセスする方法はありますか? 例えば「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 = ""」のように書いてもアクセス出来ないのはわかります。 フォームクラスのファイル中にもうひとつクラスを書いてしまっているのが悪いのもわかります。 この辺りをどのように実装したらよいでしょうか。 わかりづらくて申し訳ありません。 ご指導よろしくお願い致します。

  • abstractなClassについて

    (1)abstractなClassはabstractなmethodを持っていてもnewすることができる。 (2)(1)のabstractなClassを継承したClassは、(1)のabstractなmethodを実装しないとnewすることができない。 この認識は正しいでしょうか?

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

    私は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
  • 継承を重ねた場合のコストはどうなるのでしょうか?

    仮想関数を使った方がはるかに楽になる場合で、意味的にもまさに継承がベストという場合を除いては継承は使わない、使う場合も、なるべく1回で、かつ一つで十分になるような方法を考える方針できたのですが 今までは手持ちの情報的に問題ないだろうとおもっていたのですが、ある新事実が発覚したため 一回の継承では別々の親クラスとして作ることとなり、あとで同じ基底クラスのポインタとして扱えないタイミングが生じて面倒が出るか、あるいはそれ以外で一つにまとめようとするとどの方法をとっても非常に大きなコードの無駄が生じることになり コスト的に問題なく出来るなら二段に継承したいという状況が発生しました。 現在1段の継承をしている状態で、基底クラスは別々に二つあり、どちらも抽象クラスで、もしこれらのさらに親クラスを同じものとして作るような形に変更した場合、二段階に継承するといっても、どちらにしてもその時に最終的に完成する、3段目の孫クラスで始めて実体を作れる(コンストラクタを呼べる)ようになる つまり、そうなっても親と子は抽象クラスという状態になります。 真ん中のクラスで、一番上のクラスの純粋仮想関数をoverrideする関数もいくらかは出てくるかもしれませんが、定義せずに残す事が確実に決まっている関数も既に存在しますし、逆に真ん中のクラスで増える純粋仮想関数も存在する見込みです。 こういった状況で、問題と考えられるのはただ一つ、コストに関して、なのですが 全ての仮想関数は、オーバーライド回数は親・子・孫間で必ず1回に限定されるようにプログラムする場合 1. 結局それに関しては一回分の継承とまったく同じコストになると考えて良いでしょうか? つまり仮想関数が、だいたいは関数ポインタのような原理で動いているとすれば、テーブルの要素(?)が増えた場合にコストが変わる、とか、継承回数が変わると一番上で宣言した純粋仮想関数を、真ん中でまったくoverrideせずに孫クラスでoverrideした場合、一段階しか継承せずに(単純に親クラスで宣言したのを子クラスでoverride)した場合とは実はコストが変わるとか そういう事はまずないと考えて良いのでしょうか? 2. 仮想関数で最も恐れるべきはキャッシュミスだと思うのですが、それについての危険性はそれほどかわりがない、でしょうか?簡単なクラスでベンチマークをとった結果は、「特定の範囲で繰り返してるだけ」に近かったせいか、クラスが小さかったせいか、横にはせまかったせいか、ほとんど変わりが分かりませんでした。) 3. コンストラクタやデストラクタについては、極力初期化リストで初期化、というパターンに頼った場合 かつ、孫クラス以外の、親クラスと子クラスは抽象クラスとなる、場合で かつ、親クラスのコンストラクタ、デストラクタはインライン化宣言されていて(つまり子クラスのコンストラクタ・デストラクタを呼ぶときにはその実装が既に見える位置に記述されるようになっていて) 子クラスのそれらはインライン宣言されていない という状況の場合、単純に1段階の継承のみで基底クラスのそれらがインライン宣言されていない場合と、最終的にコストは等価になると考えてもいいのでしょうか?

専門家に質問してみよう