2016-12-21 11 views
1

私は現在C++の継承について学んでいるので、この質問があいまいな場合は、事前に謝ります。C++継承:さまざまな派生オブジェクトのベース属性

このシナリオを実装する:

  1. スーパークラスは、任意の色とすることができる色属性を有する(整数で表されるのは、色を仮定する)。

  2. このスーパークラスの初期化が赤色であるとします。

  3. また、赤色を共有するサブクラスの異なるオブジェクトを初期化する予定です。私の質問がある

、私は赤に、この属性の色(またはそのことについては任意の色)を初期化することができますどのような方法があり、それが代わりに設定するのでは、サブクラスだと、それは自動的にオブジェクトが継承されるだろうこれらのオブジェクトのいずれかを初期化するたびに赤色に属性がありますか?

ここでも基本的な概念が不足しているとお詫び申し上げますが、私はこれについてオンラインで何かを見つけることはできません。要求ごと

擬似コード:

スーパークラスコード:

class Shape { 

    int color; 

    Shape::Shape(int c) : color(c) { } //constructor 

} 

サブクラスのコードは:

class Square { 

    int length, width; 

    Square::Square(int l, int w, int c) 
    : length(l), 
     width(w), 
     color(c) 
    { } 
} 

class Circle { 

    int radius; 

    Square::Square(int r, int c) 
    : radius(r), 
     color(c) 
    { } 
} 

私が言うことをしようとしていることであることの両方の正方形とサークルは同じ色を持つ必要があります。とにかく(このクラスはスーパークラスからですか?)この色(たとえば赤)を宣言するために、両方のシェイプで同じ色が設定されますか?次のように以前のC++ 11に

+0

基本クラスにcolor属性があり、派生クラスにもcolor属性がありますか? MVCEが役に立ちます。 –

+0

スーパークラスから明らかに継承されているcolor属性はありません – Logan

+0

あなたの考え方を擬似コードの例で投稿してください。あなたは "属性"という言葉を使用していますが、 "属性"(メンバー変数、仮想メンバー機能付きのデフォルト実装など)を実装する方法は非常に多数あります。また誰が初期化を行っていますか? (また:initialize *は毎回毎回値を設定していますが、わずかに構文が異なります) – iAdjunct

答えて

1

は、あなたは何色が明示的に指定されていない場合に使用されます静的default_colorで欲しいものを達成でき、かつ色がある時はいつでも設定されます:ユーザーが選択したカラーオーバーライド

このサンプル・プログラムプリント7、指定された。

struct Shape { 
    static int default_color; 
    int color; 
    Shape(int c) : color(c) 
    { 
     default_color = c; 
    } 
    Shape() : color(default_color) {} 
}; 

Shape::default_color = BLACK; 

struct Square : public Shape { 
    int length, width; 
    Square(int l, int w, int c) 
    : Shape(c), 
     length(l), 
     width(w), 
    { } 

    Square(int l, int w) 
    : length(l), 
     width(w) 
    { } 
} 

struct Circle : public Shape { 
    int radius; 
    Circle(int r, int c) 
    : Shape(c), 
     radius(r) 
    { } 

    Circle(int r) 
    : radius(r) 
    { } 
} 

int main() 
{ 
    Square sq(2, 3, RED); 
    Circle cir(10); // Automatically red, since that's 
         the last color explicitly specified 
} 

私はこれが貧しいデザインだと思います。このようなグローバルな状態は、間違いを起こしやすい。シェイプを作成するたびに、プログラム全体の状態を考える必要があります。 CircleCircle cir(10, sq.color);と簡単に作成する方がよいでしょう。これにより、あなたのCircleの色が明示され、プログラマーの認知負荷が軽減されます。

+0

私は参照してください。私は好奇心からこのコンセプトを模索していて、明確化が必要でした。実用的なアプリケーションとしては、それは貧しい実践であり、破壊的であることを証明することができます。ありがとう – Logan

1

、これを行うための主な方法は次のようになります。C++ 11以降で

class baseClass 
{ 
    int color; 

    baseClass() { color = RED; } 
}; 

class subClass : public baseClass 
{ 
    subclass() { } 
}; 

を、あなたはクラス宣言にデフォルト値を割り当てることができます。

class baseClass 
{ 
    int color = RED; 

    baseClass() { } 
}; 

これは継承されます。

EDIT:以下のように、デフォルトのbaseClassコンストラクタが自動的に呼び出されます。

+0

イニシャライザーリストを使用することもできます。 –

+1

':baseClass()'は決してAFAIKの要件ではありませんでした。 –

+0

@ A.S.Hあなたは間違いなしです。私は私の肺炎を責める。 :) –

0

クラスとクラスのインスタンスには違いがあります。クラスは構造のようなものであり、それに応じてさらなるインスタンスが作成されます。クラスは説明のようなもので、オブジェクトを構築する方法です。継承はオブジェクトにではなくクラスに関連しています。フィールドに関しては、継承クラスには、親クラスからのすべてのフィールドと、追加可能ないくつかの新しいフィールドがあります。

あなたのための簡単な例:

class MyBase { 
public: 
    int color; 
}; 

class MyChild : public MyBase { 
public: 
    double length; 
} 

int main() { 
    MyBase myBaseObj; 
    myBaseObj.color = 1; 

    MyChild myChildObj; 
    myChildObj.color = 2; 
    myChildObj.length = 3.14; 

    return 0; 
} 
0

は(多分スーパークラスから?)とにかくです(例:赤。)この色を宣言すると、両方の形状は、この色が同じに設定されています?

投稿された例では、はいです。スーパークラスのコンストラクタには、例えば、それが望んでいるものは何でもその変数を設定することができます。

Shape::Shape(int c) : color(7) { } // 7 == RED 

Shapeはコンストラクタが定義されていることを持っていた場合は、すべてのサブクラスのインスタンスは、赤の形を表します。

#include <iostream> 

class Shape { 
public: 

    int color; 

    Shape(int c) : color(7) { } //constructor 

}; 

class Square : public Shape { 
public: 

    int length, width; 

    Square(int l, int w, int c) 
    : Shape(c), 
     length(l), 
     width(w) 
    { } 
}; 

class Circle : public Shape { 
public: 

    int radius; 

    Circle(int r, int c) 
    : Shape(c), 
     radius(r) 
    { } 
}; 

int main() { 
    Square q(4,8,0); 
    std::cout << q.color << "\n"; 
} 
+0

私は、実際には、色の権利のための複数のオプションを受け入れるコンストラクタを持つことができるので、参照してください?これに基づいて、サブクラスが初期化される前に異なる色のスーパークラス(Shape)のインスタンスが複数ある場合、そのカラー属性はスーパークラスの最後の初期化と同じ色に設定されますか? – Logan

+0

スーパークラスのインスタンスは、必要な数だけ持つことができます。サブクラスの特定のインスタンスにとって重要なスーパークラスインスタンスは、そのサブクラスインスタンス内に含まれるものだけです。 –

関連する問題