2017-03-29 6 views
0
class A 
{ 
    public: 
     typedef struct st 
     { 
      int x; 
      int y; 
     }st; 
}; 

パブリックメンバ変数として構造体を持つクラスがあります。私は上記の構造体にいくつかの新しいエントリを追加したいと思います。私は継承を使用しました。名前(st)を変更せずにその構造体に新しいエントリを追加することは可能ですか?継承を使用してクラスのメンバであるstructに新しいエントリを追加する方法

class B:public A 
{ 
}; 

私を助けてください。

+0

上記の質問に続き、私は疑いがもう1つあります。なぜB :: st * obj = NULL; obj = new A :: st [10];これは不可能です。 ? –

答えて

2

タイプは常にプログラム全体を通じて同じまま。 A::stは、メンバーがxyです。それ以上のことはありません。Aが持つかもしれないサブクラスにかかわらずです。また、同じ名前空間内の他の型と同じ名前を持つ型はありません。

Bを作成してクラスAを拡張できるのと同じように、サブクラスを作成してクラスA::stを拡張することもできます。ご希望の場合は、そのようBのメンバクラスとしてA::stのサブクラスを宣言することができます。

class B:public A 
{ 
    struct st : A::st 
    { 
     int z; 
    }; 
}; 

は今、B::stA::stのサブクラスであり、かつBの名前空間内B::A::stを隠します。

+0

上記の質問に続き、私は疑いがもう1つあります。なぜB :: st * obj = NULL; obj = new A :: st [10];これは不可能です。 ? –

+0

@Spartacus Correct。親へのポインタは、暗黙のうちに派生するポインタに変換できません。 – user2079303

1

A内の元の構造体にメンバーを追加することはできません(btw:なぜCスタイルのtypedefですか?C++では単純に必要ありません)。

あなたができる唯一のことは、新しいデータ型を作成することにより、Bの中にあなたの構造体を拡張さ:

class A 
{ 
public: 
    struct st 
    { 
     int x; 
     int y; 
    }; 
}; 

class B : public A 
{ 
public: 
    struct st : A::st 
    { 
     int z; 
    }; 
}; 

があること、これらは異なるデータ型であり、あなたは、特定の状況下型消去を危険にさらすこと、しかし、注意してください:私が正しくあなたの質問を理解していた場合

B::st instance; 
A::st& reference  = instance; // OK 
A::st* pointer  = &instance; // OK 
A::st anotherInstance = instance; // works, but z gets erased!!! 
1

、はい、あなたはBstを拡張することができます。 A::stを継承する内部構造体をBに追加します。

https://godbolt.org/g/sWfYWY

class A 
{ 
public: 
    struct St 
    { 
     int x; 
     int y; 
    }; 
    St st; 
}; 

class B : public A 
{ 
public: 
    struct St : public A::St 
    { 
     int z; 
    }; 
    St st; 
}; 

int main() 
{ 
    A a; 
    a.st.x = 1; 
    a.st.y = 2; 

    B b; 
    b.st.x = 3; 
    b.st.y = 4; 
    b.st.z = 5; 

    return 0; 
} 
関連する問題