私はオブジェクトを与える外部コンポーネントを持っています.Aとしましょう.コードのどこかに私はこれを持っています:
A *p;
ObjContainer *pBigOne;
...
p = pBigOne->GetAPointerToSomethinOfTypeA();
ここで、A の内部に、呼び出したい保護されたメソッドがあります (想像力を働かせて、ProtectedMethod() という名前であると仮定しましょう) が、明らかにできません。これを回避するために、次のようなクラス B を作成しました。
// B.h
class B : class A
{
public:
B();
~B();
bool MyMethodIWantToCall();
}
// B.cpp
B::B(){}
B::~B(){}
bool B::MyMethodIWantToCall()
{
return ProtectedMethod();
}
上記のコードを変更します。
B *p;
ObjContainer *pBigOne;
...
p = (B *)pBigOne->GetAPointerToSomethinOfTypeA(); // (*)
p->MyMethodIWantToCall();
私は欲しいものを手に入れることができましたが、B は A よりも大きいため、これがメモリの厄介なエラーにつながる可能性があるという事実を同僚が指摘してくれました。それを確認するために、B にメンバーを追加し、それを何かとVS2010時計で調べました。VS2005 では、初期化されていない変数は 84** の値で始まります。ここでは、非常にランダムな値を取得しています。
そこで、2 つの質問があります: 1) (*) にいるとき、なぜキャストしなければならないのですか? 同じタイプじゃないの?2) 私の回避策は間違いなく安全ですか?
編集
3) これを行う最も安全な方法はありますか?