2

私は派生クラスに取り掛かったばかりで、有名なShapeクラスに取り組んでいます。が基本クラスの場合、 、、およびのShape3 つの派生クラスがあります。の派生クラスです。派生クラスのコンストラクターから基本クラスのコンストラクターに引数を渡す必要があると思いますが、これを行う方法が正確にはわかりません。シェイプを作成するときに、シェイプの寸法を設定したいと考えています。基本クラスと 1 つの派生クラスについては、次のとおりです。CircleRectangleSquareSquareRectangle

Shape(double w = 0, double h = 0, double r = 0)
{
     width = w;
     height = h;
     radius = r;
}


class Rectangle : public Shape
{
     public:
     Rectangle(double w, double h) : Shape(double w, double h)
     {
         width = w;
         height = h;
     }              
     double area();
     void display();      
};

私はここで正しい軌道に乗っていますか?次のコンパイラ エラーが発生しています: expected primary expression before "double"、各派生コンストラクターで。

4

2 に答える 2

3

に変更Shape(double w, double h)する必要がありShape(w, h)ます。ここでは、実際に基本コンストラクターを呼び出しています。

さらに、派生クラスのコンストラクター本体にwidthandを設定する必要はありません。height

  Rectangle(double w, double h) : Shape(w, h)
  {}

で十分です。これは、初期化子リストShape(w, h)で基本クラスのコンストラクター ( shape) が呼び出され、これらの値が設定されるためです。

派生オブジェクトが作成されると、以下が実行されます。

  1. のメモリShapeが確保されています
  2. 適切な Base コンストラクターが呼び出されます
  3. 初期化リストは変数を初期化します
  4. コンストラクターの本体が実行されます
  5. コントロールは呼び出し元に返されます

あなたの例では、Shapeサブオブジェクトはによって初期化されShape(double w = 0, double h = 0, double r = 0)ます。このプロセスでは、基本部分 ( widthheightradius) のすべてのメンバーが基本コンストラクターによって初期化されます。その後、派生コンストラクターの本体が実行されますが、すべて基本コンストラクターによって処理されるため、ここでは何も変更する必要はありません。

于 2013-05-10T04:50:36.293 に答える
0

ほとんど。ここでパラメータを再宣言する代わりに:

Rectangle(double w, double h) : Shape(double w, double h)

単純に「パススルー」する必要があります (不正確な言い回しを与えるため):

Rectangle(double w, double h) : Shape(w, h)
{ }
于 2013-05-10T04:52:34.610 に答える