※ ChatGPTを利用し、要約された質問です(原文:ポインタのキャストについて)
ポインタのキャストについて
このQ&Aのポイント
ポインタのキャストについて説明します。HOGEクラスとHOGE_Derivedクラスについてのコード例を使用して、メモリ上のデータの並びについて説明します。
また、HOGE_Derivedクラスで演算子のオーバーロードを行っているコードについても説明します。
memcpyを使用したコピーの方法について処理系の依存性や自然さについても考察しています。
下記のようなクラス定義があるとします。
説明のため、関係のない要素は省略し簡略化しています。
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クラスの部分だけと言うことは分かっているのですが、その部分のメモリ上の並びが必ず基本クラスの各フィールド→派生クラスで定義されたフィールドの順になっているのかどうか分かりません。
よろしくお願いします。
お礼
ご自身の作業時間を削ってまでお付き合い頂き、大変ありがとうございました。 改めて基本的な部分から見直すきっかけとなり、大変有意義なQ&Aとなりました。 ベストアンサーは決めにくいので、とりあえず本回答をベストアンサーとして、質問を締め切らせて頂きます。 ご回答頂いた全ての皆様、ありがとうございました。