作者: Koichi Yamamoto
日時: 2002/3/31(01:22)
こんにちは、山本です。

"kikwai@... (機械伯爵)"さんは書きました:
>  「リファレンス(参照)」なら暗示的にキャストできます。
> 
>  でも、C++では「クラスインスタンスそのもの」が生成できるんです。
> 
> ※newキーワードもmallocも使わないでクラスインスタンスを生成できることが、
>  もしかしたら忘れられているのかもしれませんが・・・

それは

class T { 宣言 };
T a;

のことを意味していますね?

>  参照(リファレンス・・・あるいは誤解を覚悟で言うならポインタ)と、参照
> でないものの違いはなかなか難しいのですが、とりあえずC++では、参照を増やして
> もオブジェクトの占めるメモリは増えず、アクセスできるポイントだけが増えますが、
> 実体を増やすと、別のメモリスペースにオブジェクトがクローンされます。
> 
>  ここらへんの事情がわかると、あらためて新しい言語のありがたさが分かります。

いえ、そういう話をしているのではなく、あくまで
明示的なキャストがないとスーパークラス型にならない場合を
私は知りたいのです。

"kikwai@... (機械伯爵)"さんは書きました:
>  C++はクラスインスタンスについては非常にシビアなので、明示的なキャスト
> がなければスーパークラス型にさえなりません。

class B { 宣言 };
class D : public B { 宣言 };
void f(B b) { 定義 }
D derived;
B base1 = derived;         ←(1)
B base2; base2 = derived;  ←(2)
f(derived);                ←(3)

(1)と(3)ではコピーコンストラクタB(B&)が、
(2)ではoperator=(B&)が呼び出されますから、
派生クラスDのインスタンスderivedに明示的キャストが
無くてもコンパイルエラーになりません。

もっとも、class D : private B とすれば基底クラスへのアクセスは
不可能になるので、この場合はコンパイルエラーになります。
# 今そのことに気付いたんですけど(^^;;;
「明示的なキャストが無ければ...」というのはこのことを指していますか?

# スクリプト言語ネタでなくて申し訳ないです。
# でも、仕事上どうしても気になってしょうがないので(^^;

--
Koichi Yamamoto, 
http://www3.ocn.ne.jp/~yamako/