トップページ⇒tech
84コメント21KB

C++多重継承

■ このスレッドは過去ログ倉庫に格納されています
0001♯6411NGNG
多重継承はCoolなのか、Harmfulなのか?
是非を問うてみたい。非非のオンパレードになりそうだけど。
多態マンセー!

なお、C++BuilderのTObject派生クラスにおいては、
多重継承は許されていません。
0002いんたーふぇーすNGNG
 かふか
0003デフォルトの名無しさんNGNG
>>1
そもそもC++がCoolじゃない。
そもそもC++がHarmful。
0004デフォルトの名無しさんNGNG

満場一致で終了
0005デフォルトの名無しさんNGNG
多態と多重継承はかんけーない
0006♯6411NGNG
>>5 たしかに直接の関係はないすね。
イテクルヨ
0007デフォルトの名無しさんNGNG
MFCは多重継承の使用を考えてないデザインだからウザイ。
OWLが良かったよ〜。
0008デフォルトの名無しさんNGNG
>>7
世の中は内容を吟味せずにイメージだけで選んじゃう人が大多数だから・・・
(BC++に関してはボーランドが自分でこけた部分もあるようだけど)
0009デフォルトの名無しさんNGNG
>>1
インターフェース継承は cool
実装継承は諸刃の剣で、扱いを間違えると辛いわな

>>8
BC++ はライブラリは良くても、コンパイラとデバッガ、エディタが
ねぇ……。SDK への対応が遅れるのも辛い。
0010デフォルトの名無しさんNGNG
BC++はメモリリーク検出ツールが使いやすくて良かった…
0011デフォルトの名無しさんNGNG
>BC++に関してはボーランドが自分でこけた部分もあるようだけど

詳細教えて。
0012RubyNGNG
C++なんて問題外
0013デフォルトの名無しさんNGNG
RubyはC++で出来てんじゃないの?>12=shige
0014デフォルトの名無しさんNGNG
ハァ?
0015shigeNGNG
ハァ? ちが
0016デフォルトの名無しさんNGNG
多重継承って現実の概念で例えればどんなものを表現するのに使いますか?
0017>16NGNG
例えばあなたは男性であり地球人であり引きこもりであり2ちゃんねらーであるということです。
0018デフォルトの名無しさんNGNG
>>17
それを多重継承で表現すんのか?
0019デフォルトの名無しさんNGNG
>17
男性にも 地球人のも 引きこもりにも 2ちゃんねらーにも 人という概念が
ルートにあると思われますが? 大丈夫ですね? あなたの実装は
0020デフォルトの名無しさんNGNG
>>19
それは多重継承とはいわない
0021デフォルトの名無しさんNGNG
>>20
どうして?
人の属性は全部に含まれると思うけど
0022デフォルトの名無しさんNGNG
class pencil{

}
class eraser{

}
class MitubishiPncil:public pencil,public eraser{

}
0023デフォルトの名無しさんNGNG
class FFChoroQ: public ChoroQ
{

}

class RRChoroQ: public ChoroQ
{

}

class 4WDChoroQ : public FFChoroQ,RRChoroQ
{

}

で、いいですか?
0024デフォルトの名無しさんNGNG
>21
あなたはいったい何の根拠があって
火星人の引きこもり2ちゃんねらーの
存在を否定するのでしょう?
0025デフォルトの名無しさんNGNG
どうして誰も>>21の事をバカだと言ってあげないのだろう?
もしかして、実は誰も多重継承がなにか理解していないとか(藁
0026デフォルトの名無しさんNGNG
25みたいな奴が多いなこのスレ。
1から25まで、みんな逝ってよし。
0027デフォルトの名無しさんNGNG
>>23
クラス4WDChoroQは基底クラスChoroQのメンバを
重複して持っているので逝ってよし!
0028デフォルトの名無しさんNGNG
>>26=21
0029デフォルトの名無しさんNGNG
火星"人"なのに人の属性含まないの?
0030デフォルトの名無しさんNGNG
限りなく名スレの予感…。
0031デフォルトの名無しさんNGNG
>>27
しまった!
RRとFFが派生じゃなく基底ならいいんだよね?(^^;
0032♯6411NGNG
>>31 ChoroQが仮想基底クラスだと丸く収まるかな?
0033デフォルトの名無しさんNGNG
多重継承する時はVirtual継承にしておくと、後々助かるよ!(・∀・)
0034デフォルトの名無しさんNGNG
なるほど、勉強になります。
でも、多重継承が必要な局面に遭遇したことがない(^^;
0035デフォルトの名無しさんNGNG
メジャーな処理系で多重継承サポートしてるのはC++だけだからね
JavaもC#もRubyも多重継承なんぞ必要としていないのさ
0036デフォルトの名無しさんNGNG
多重継承って大規模システム開発とかでも使われてるのか??
0037デフォルトの名無しさんNGNG
>>36
大規模なら事前/事後にチェックが入るから、
使ったとしても、チェック機構があるゆえ、マトモに動く。

大規模でないのに採用する理由があるか、という話なら興味があるね。
0038デフォルトの名無しさんNGNG
Mix-inって昔は多重継承使って実装するもんだったけど
今は違うのかな...
class Mixin<A> extends A
なんてできる言語もあったが。
0039デフォルトの名無しさんNGNG
>>38
C++ なら、template でクラス階層に挟み込める。
0040デフォルトの名無しさんNGNG
>>39
その名もずばり
「insert class Bar before Foo;」
という構文を使えるマイナー言語を、使ったことがある。
結構愉快だった。
beforeってのは、FooとFooのsuperclassとの間(直前?)に
Barを挟むことが出来るという意味で。
0041デフォルトの名無しさんNGNG
多重継承不要で盛り上がってるところ悪いけど
ものすごく便利だ 多重継承マンセー
単継承のみなんて面倒臭くて・・
まあ 好き好きだと思いますが
0042デフォルトの名無しさんNGNG
多重継承という場合、広義には実装継承とインターフェース継承、そし
て Mixin も含まれると思うんだが、何について話しているのか明確に
しないと混乱しないか?

>>35
Java にはクラスの多重継承はないが、インターフェースの多重継承は
ある。Ruby も Mixin はできるよね。
0043厨NGNG
多重継承ってつかったことないんだけど、どういった局面で使うのかな?
多重継承でなければダメって場合もあるのだろうか。
0044ジェームズNGNG
ジェラールとレオンから多重継承しましたが何か?
0045デフォルトの名無しさんNGNG
>>43
その議論は、死ぬほど行われている。webなどで検索しろ。
下手にここで振ると厨房であふれるからやめろ。
0046>42NGNG
ここはC++多重継承スレ
0047デフォルトの名無しさんNGNG
胆汁継承
0048デフォルトの名無しさんNGNG
重軽傷
0049デフォルトの名無しさんNGNG
>>44
それを多重継承というならJavaは多重継承しまくりの言語ということになるが。
0050教えて君NGNG
Mixin ってなに?、継承と何が違うの?。解説をキボーン。
0051デフォルトの名無しさんNGNG
多重継承使いは、問答無用で逝ってよし!
0052デフォルトの名無しさんNGNG
多重継承を便利だと言ってはばからないのは、継承ツリーを行き当たりばったり
で作ってますって告白してるのとおんなじでかなり恥ずかしい行為だぞ。
せめて「工数と相談して止むを得ず採用することも有る」ぐらいにしとけ。
0053デフォルトの名無しさんNGNG
>>46
いや、C++ だからこそ明確にしておこうと言ってる。

Ruby や Java ではインターフェース継承、Mixin は実装継承と言語
レベルで区別されてる(実装継承は禁止されている)けど、C++ の場
合は区別されてないから。

>>50
Mixin は多重継承のルール。

まずインスタンスを持たず、Mixin 以外のスーパークラスを持たないク
ラスを Mixin と定義する。次に多重継承する場合、Mixin はいくつ継
承しても構わないが、それ以外のクラスは一つのみに限定する。

こうするとクラス階層が単純な木構造になるので、多重継承した場合に
生じるざまざまな問題を回避しつつ、多重継承のおいしい部分は利用で
きる。
0054デフォルトの名無しさんNGNG
>>52
ATL/WTL は多重継承前提のライブラリだが、決して継承ツリーを行き
当たりばったりで拡張したわけではない。むしろ、設計は良いと思う
んだが、どうよ?
0055デフォルトの名無しさんNGNG
>>54
> ATL/WTL は・・・んだが、どうよ?

って、誰も使ってないでしょ。
0056デフォルトの名無しさんNGNG
>>55
>って、誰も使ってないでしょ。
今、仕事でATLを使っているから、誰も使っていないわけではない。
                     ~~~~~
005752NGNG
>>53
コーディング規約に毛の生えたようなMixinで可読性を下げるよりComposit
した方が潔いと思われ。

>>55
んだんだ。
0058デフォルトの名無しさんNGNG
ATLは使わんわけにはいかんでしょ
0059デフォルトの名無しさんNGNG
>>57
Mixin が可読性を下げるというのは、初めて聞いたな。なにか事例は
あります?
006052NGNG
だからCompositと比較してくれ。
違いが気にならないなら放置でいいよ。
0061デフォルトの名無しさんNGNG
>59
単に言語が直接サポートしない概念を無理やり実装しても
一般性を欠き結果的に読みづらいコードになるってことでしょ。
別にmixinの有用性を否定しているわけではないと思う。
006252NGNG
>>61
援護してもらって申し訳ないが、半分ぐらい否定してる。
0063デフォルトの名無しさんNGNG
多重継承なんて使った事ないよ〜。
0064デフォルトの名無しさんNGNG
>>63
精進しなされ。
0065デフォルトの名無しさんNGNG
>>52
多重継承しなければコーディングできない例っていうのが実はある。
よく知らないと思われるね。
迂回するためにクラスが爆発的に増えるのが単継承の欠点。
0066デフォルトの名無しさんNGNG
Javaが採用しないものが正しいわけないだろ!!>65
多重継承する奴バカ、大バカ!!
てめーらみたいな低俗低脳がいるから世の中が腐るんだ
氏んで詫びろ!!
0067デフォルトの名無しさんNGNG
 再帰しなければコーディングできない例っていうのが実はある。
 よく知らないと思われるね。

と似てる雰囲気の発言かもな
0068デフォルトの名無しさんNGNG
C++の多重継承はホントに多重だと継承出来ない

 それぞれが独立でなければ継承出来ないなら入れ子にしてインターフェースで外見を整え
るCのレベルで出来る戦略を通した方が100倍マシかと
0069デフォルトの名無しさんNGNG
ATLを見ていると多重継承ってべんりだなと思う今日この頃。

ディスパッチインタフェースをもったウインドウを実装するのに
CWindowImplとIDispatchImplのふたつの基底クラスを継承するというのは
すごく素直な表現だとおもう。

さらにCOMインタフェースを追加するなら、その分多重継承すればいいし。
ポインタ変換はキャストすればいいだけ。

これに対してMFCのCOMインタフェースは包含によって実装するが
ベースクラスへのポインタを求めるためにおかしなポインタ計算
(結局はコンパイラがやっている多重継承クラスのキャストを自前でやっている)
しなければならない。
0070デフォルトの名無しさんNGNG
プログラミングは条件との戦いでもあるから

多重継承出来る時は多重継承で解決すればいい
あっても移植性を考えて使わないというならそれでいい

無ければクソとかいう発言にはあまり意味がない。
0071デフォルトの名無しさんNGNG
>>70
正論すぎ
0072デフォルトの名無しさんNGNG
誰でも簡単に手に入れられそうな例題ってiostreamじゃない?
いい例題と言えるかどうかはしらん。

class ios
class istream :public virtual ios
class ostream :public virtual ios
class iostream:public istream, public ostream

最近のはちょっと違うけど。
0073lNGNG
無謀な多重継承によって後の開発に重軽傷を負った。
0074デフォルトの名無しさんNGNG
Javaのような、インターフェースとしての利用に徹した多重継承ならどうよ?
インターフェースなしでやるとえらい大変なメになるってんなら、これくらいはアリかと思うんだけど。
0075デフォルトの名無しさんNGNG
インターフェースも多重継承にはいるの?
0076デフォルトの名無しさんNGNG
入らないような、でも結局「ソレ」として参照できる時点で
ある種の問題を抱えているような。
まあそれは包含しても集約しても同じか。
0077デフォルトの名無しさんNGNG
> ある種の問題を抱えているような。
何?
0078デフォルトの名無しさんNGNG
>>73
バカに刃物を握らせてはいけない
切れる刃ほど怪我をする
0079デフォルトの名無しさんNGNG
>>73
クラス階層の設計が甘いと後々苦しむのは、多重継承に限らないと思われ。単一継
承でも十分に痛いし。

>>76
何が問題なの?
0080 NGNG
>>75
多重継承はデータとメソッドを継承する。
インターフェースはメソッド名のみ継承する。
 多重継承の一部を切り取った概念だと理解してるんだけど、、違う?
0081デフォルトの名無しさんNGNG
>>80
インターフェースstaticなデータは継承できるでしょ
0082デフォルトの名無しさんNGNG
>>80
interface 継承は実体がないので、多重に継承してもあまり害はない。実装が
一つだけなら vtbl のエントリが複数あっても同じメソッドへのポインタで埋
まるだけだし。
0083デフォルトの名無しさんNGNG
Eiffelの多重継承は便利だと思う。

class A feature
  x: INTEGER
  y: INTEGER
end

class B inherit A end ;  class C inherit A end

class D inherit B rename y as y1
           end
         C rename y as y2
           select y2
           end
end

とすると x が仮想継承になって y が非仮想継承になる。
select y2 はC++ふうに書くと
A* a ;
D* d = new D ;
a = d ;
a.y のとき y1とy2 どっちか指定する。
0084デフォルトの名無しさんNGNG
多重継承されていることを、そのクラスと関連する他のクラスが
意識する必要があるかどうか、がポイントのような気がするなあ。
■ このスレッドは過去ログ倉庫に格納されています