基本クラスのポインタからC ++アクセス派生クラスメンバ
-
19-09-2019 - |
質問
Derived
の基底クラスを持つ)クラスBase
のオブジェクトを割り当て、ベースクラスを指す変数にそのオブジェクトへのポインタを格納する場合、、どのようにDerived
クラスのメンバーにアクセスすることができます。<? / P>
ここでは一例です。
class Base
{
public:
int base_int;
};
class Derived : public Base
{
public:
int derived_int;
};
Base* basepointer = new Derived();
basepointer-> //Access derived_int here, is it possible? If so, then how?
解決
derived_int
がderived_int
の一部であるためDerived
がbasepointer
へのポインタである一方、いいえ、あなたは、Base
にアクセスすることはできません。
あなたはしかし、それを他の方法でラウンドを行うことができます:
Derived* derivedpointer = new Derived;
derivedpointer->base_int; // You can access this just fine
派生クラスは、基本クラスのメンバーではなく、他の方法で回避を継承します。
あなたのbasepointer
がDerived
のインスタンスを指していた場合しかし、その後、あなたはキャストを介してアクセスできます:
Base* basepointer = new Derived;
static_cast<Derived*>(basepointer)->derived_int; // Can now access, because we have a derived pointer
あなたが最初にpublic
ためにあなたの継承を変更する必要があります注:
class Derived : public Base
他のヒント
あなたはここに地雷原の上で踊っています。ベースクラスは、それが実際に派生のインスタンスだということを知ることはできません。それを行うための最も安全な方法は、ベースに仮想関数を導入することになります:
class Base
{
protected:
virtual int &GetInt()
{
//Die horribly
}
public:
int base_int;
};
class Derived : Base
{
int &GetInt()
{
return derived_int;
}
public:
int derived_int
};
basepointer->GetInt() = 0;
basepointer
、あなたのプログラムが意図した結果である、恐ろしく死んでしまうことを他の何かとしてDerived
ポイントもします。
また、あなたがdynamic_cast<Derived>(basepointer)
を使用することができます。しかし、あなたはそのためBase
に少なくとも1つの仮想関数を必要とし、ゼロに遭遇して調製されています。
static_cast<>
は、いくつかの提案のように、足で自分自身を撮影する確実な方法です。 「C言語ファミリーの危難」ホラーストーリーの広大なキャッシュには寄与しないでください。
あなたが使用することができます CRTPする
あなたは基本的に、基本クラスのテンプレートに派生クラスを使用します。
これは、基底クラスが派生クラスの型を知らせることによって可能です。これは、基本クラス派生型のテンプレートを作成することによって行うことができます。このC ++イディオムは、テンプレートpattern">不思議定期的なテンプレートパターンを繰り返し
//あなたが使用しようとしているクラス派生何を知っていれば、 派生* derivedpointer = dynamic_castを<派生*> basepointer; //あなたは、