なぜベースクラスポインタが派生クラスを指すのは安全であり、派生クラスがベースクラスを指すのは安全ではないのか.

946 ワード

  :
	class a
	{
	public:
		int aa
	};
	class b:public a
	{
	public:
		int bb;
	}

メモリから見るとa
---------|
|intデータサイズを1つ占める--|
|----(aaデータ)----|
|---------
bは
---------|---------
|intデータサイズを1つ--|Intデータサイズを1つ--|
|aから受け継がれてきた----|---(bbデータ----|
|------------------
ベースクラスタイプのポインタを定義すると
a *p;このとき,このポインタはa型のデータを指す.
pポインタが派生クラスを指す場合、pはa型のポインタであるため、*pはa型データの長さ、すなわち
————————-|---------
|intデータサイズを1つ--|Intデータサイズを1つ--|
|aから受け継がれてきた----|----(bbデータ)----|
|------------------
|------------|------------| 
|-pはこの領域のみを指す-|
したがって,ベースクラスのポインタ(P)が派生クラスを指す場合,派生クラスでベースクラスから継承されたデータとベースクラス自身のデータしか操作できない.
派生クラスがベースクラスを指すポインタは、メモリ空間がベースクラスより長いため、深刻な結果をもたらすため、派生クラスのポインタがベースクラスを指すことは許されません.強制変換でコンパイルできますが、これは極めて安全ではありません.
C++のマルチステートパフォーマンスは、ベースクラスポインタが派生クラスのデータメンバーを操作できないという問題を解決します.