クラス階層と多重継承についてです。
参考書籍は、プログラミング言語C++ 第4版 です。
(予定していたvirtualに関する質問は自力で解決できました。)
1,基本クラスのポインタに派生クラスのオブジェクトのアドレスを代入する時、継承関係は、public継承でなくてはならない理由は何でしょうか??
C++
1class Employee(){ } 2class manager : public Employee {} 3 4manager obj; 5Employee * ptr = &obj; // ok
自分の予想です。
public継承以外だと、あるメソッドやメンバ変数のアクセス指定子が基本クラスと派生クラスとで異なるものになってしまうから
でしょうか?(たぶん)
2,virtual継承の効果について
virtual継承がよく分かりません。
要は、virtual継承と言うのは、多重継承の際に使用する物!
ということですよね。
多重継承の際に複数の基本クラスを唯一のオブジェクトにする これだけですか??
virtualと付いていると仮想関数と混同しちゃうんですが・・・これは、仮想関数とは全く別物という理解で正しいのでしょうか?
virtual継承の場合も実行時型情報は付与されるのでしょうか?
virtual継承を行った場合、その基本クラスはポリモーフィック型になるんでしょうか?それとも派生クラスの方かな?
以下書籍の中で重要そうなことの抜粋
・仮想基底クラスを表現する共有オブジェクトを指すポインタはオフセットになる。
・多くの場合、1個の仮想基底ごとに1ワードのメモリのオーバーヘッドとなる。(64bitCPUだと、8btyeですかね?)
・仮想基底は、最派生クラスにとって、直接の基底とみなせるのである。
・仮想基底のデストラクタは、ちょうど1回だけ実行される。
・仮想基底関数のオーバーライドの際に、異なる複数の派生クラスが、同じ関数をオーバーライドするとどうなるだろうか?それが認められるのは、オーバーライドしようとするクラスが、その関数をオーバーライドする別の全てのクラスから派生している場合に限られる。すなわち、1個の関数で、他の全てをオーバーライドしなければならない。
2個のクラスが基底クラスの1個の関数をオーバーライドしていながら、それらのクラスの一方が、もう一方をお互いにオーバーライドしていなければ、そのクラス階層はエラーとなる。
3つ目は、えーーと。どんなに深くクラス階層を作ったとしてもvirutal継承をしていれば、基底クラスはすべて直接の基本クラスとなる。ということですよね。つまり、間接の基本クラスになる場合はない。
4つ目は、えーーーー。これはなんのことだかよく分かりませんね。
virtual継承の際には、仮想基底クラスのすべての関数を1つの各派生クラスでオーバーライドしなくてはならない。ということですかね。
イマイチvirtual継承がよく分からない。
3,クロスキャストって必要なものなのでしょうか??
「ダウンキャスト」の場合、ゲームなどでは時々登場する
と言った内容の記事を見たことがあります。
じゃぁ、クロスキャストは??どんな時に便利で、どんな時に必要になるんでしょうか?
簡単にいうと、クロスキャストはダウンキャストしてアップキャストすることです。ダウンキャストを伴う以上危険性はありますが、これはダウンキャストと同じ方法で回避することが出来ます。第2部第42章に話した dynamic_cast ですね。ランタイムタイプ情報(RTTI)を有効にするのも忘れてはいけません。
2段階のキャストが暗黙の内に行われているようですね。
何に使うのか全く分からない。
環境は Linux g++ です。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/21 04:16
2018/09/21 04:24
2018/09/21 04:36 編集
2018/09/21 05:18
2018/09/21 05:39
2018/09/21 05:53
2018/09/21 05:58
2018/09/21 06:13
2018/09/21 06:20
2018/09/21 07:12
2018/09/21 08:04
2018/09/21 08:20 編集
2018/09/21 09:50
2018/09/21 10:41