ポインタのキャストについて
下記のようなクラス定義があるとします。
説明のため、関係のない要素は省略し簡略化しています。
class HOGE
{
int a;
char c;
LPSTR lpszStr;
// メンバ関数定義
}
class HOGE_Derived : public HOGE
{
LPSTR _lpszStr;
HOGE_Derived& operator= (HOGE& obj_HOGE);
HOGE_Derived& operator= (HOGE_Derived& obj_HOGE_Derived);
// メンバ関数定義
}
このとき、下記のようなコードで演算子のオーバーロードを行っていますが、これは正しいのでしょうか?
HOGE_Derived& HOGE_Derived::operator= (HOGE& obj_HOGE)
{
memcpy((HOGE*)this, &obj_HOGE_Derived, sizeof(HOGE));
lpszStr = NULL;
// lpszStrのディープコピー
_lpszStr = new char[strlen(obj_HOGE.lpszStr) + 1];
strcpy(_lpszStr, obj_HOGE.lpszStr);
lpszStr = _lpszStr;
return *this;
}
HOGE_Derived& HOGE_Derived::operator= (HOGE_Derived& obj_HOGE_Derived)
{
memcpy((HOGE*)this, (HOGE*)&obj_HOGE_Derived, sizeof(HOGE));
lpszStr = NULL;
// lpszStrのディープコピー
_lpszStr = new char[strlen(obj_HOGE_Derived.lpszStr) + 1];
strcpy(_lpszStr, obj_HOGE_Derived.lpszStr);
lpszStr = _lpszStr;
return *this;
}
期待した動作は、まず最初のmemcpyで、obj_HOGEまたはobj_HOGE_Derivedオブジェクトのうち、基本クラス(HOGE)に存在するフィールドint aとchar cのみをコピーしたいのです。
memcpyによってこのようなコピーを行った時、処理系に依存せず期待した通りコピーできるものなのでしょうか?
そもそも、このようなコピーの仕方自体、自然なやり方でしょうか?
気になるのは、HOGE_Derivedクラスのオブジェクトのメモリ内のデータの並びがどのようになっているのかと言うことです。
HOGE_Derivedクラスのポインタを、その基本クラスであるHOGE型にキャストした時に、このポインタで見えるエリアが、HOGE_Derivedクラスの中のHOGEクラスの部分だけと言うことは分かっているのですが、その部分のメモリ上の並びが必ず基本クラスの各フィールド→派生クラスで定義されたフィールドの順になっているのかどうか分かりません。
よろしくお願いします。