なぜベースクラスポインタが派生クラスを指すのは安全であり、派生クラスがベースクラスを指すのは安全ではないのか.
:
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++のマルチステートパフォーマンスは、ベースクラスポインタが派生クラスのデータメンバーを操作できないという問題を解決します.