質問

私は(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_intderived_intの一部であるためDerivedbasepointerへのポインタである一方、

いいえ、あなたは、Baseにアクセスすることはできません。

あなたはしかし、それを他の方法でラウンドを行うことができます:

Derived* derivedpointer = new Derived;
derivedpointer->base_int; // You can access this just fine

派生クラスは、基本クラスのメンバーではなく、他の方法で回避を継承します。

あなたのbasepointerDerivedのインスタンスを指していた場合しかし、その後、あなたはキャストを介してアクセスできます:

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;

//あなたは、

derivedpointerを使用して派生クラスにアクセスすることができます
scroll top