私はかなり長い間C++で複数の継承を使用してきましたが、今日では、サブクラスの1つとして参照するときにポインタアドレスが異なる可能性があることを暗示しています。例えばサブクラスのキャストとポインタのアドレスの変更
Iしている場合、:コンストラクタ上に印刷されたとき
class ClassA{
public:
int x;
int y;
ClassA(){
cout << "ClassA : " << (unsigned int)this << endl;
}
};
class ClassC{
public:
int cc;
int xx;
ClassC(){
cout << "ClassC : " << (unsigned int)this << endl;
}
};
class ClassB : public ClassC, public ClassA{
public:
int z;
int v;
ClassB(){
cout << "ClassB : " << (unsigned int)this << endl;
}
};
int main(){
ClassB * b = new ClassB();
}
クラスA及びクラスCは異なるアドレスを有しています。
しかし、私はお互いに戻ってそれらをキャストしようとすると、それだけで自動的に動作します:
ClassA * the_a = (ClassA*)b;
cout << "The A, casted : " << (unsigned int)the_a << endl;
ClassB * the_b = (ClassB*)the_a;
cout << "The B, casted back : " << (unsigned int)the_b << endl;
が、私はこの種の情報は、コードからコンパイラによって導くことができると仮定し、それは安全ですこれはすべてのコンパイラで動作するとしますか?
追加の質問:サブクラスの場所の順序を強制できますか?たとえば、classAがサブクラス化されているClassCと最初に(基本的に同じポインタの場所を共有する)必要がある場合は、最初にサブクラスの宣言に入れる必要がありますか? 更新さて、注文を強制することはできないようです。スーパークラスのレベルで、構造の "ルート"アドレス、サブクラスに割り当てられたアドレスの開始を見つけることはまだ可能ですか?たとえば、ClassBのアドレスをClassAから取得します。
あなたは_ "ルート" _アドレスを取得できるとは思いません。私はそれについて別の質問をするだろう。標準からのAFAICTでは、基本クラスのメンバーまたはサブオブジェクトがより低いメモリアドレスに配置されることさえ保証されていません。言い換えれば、 'the_a'が' the_b'やそれ以外のものより低いアドレスを持つという保証はありません。 –