0

私の教授は、継承の例を示すために次のコードを与えました。

//Base class
class Inventory {
    int quant, reorder; // #on-hand & reorder qty
    double price; // price of item
    char * descrip; // description of item
public:
    Inventory(int q, int r, double p, char *); // constructor
    ~Inventory(); // destructor
    void print();
    int get_quant() { return quant; }
    int get_reorder() { return reorder; }
    double get_price() { return price; }
};
Inventory::Inventory(int q, int r, double p, char * d) : quant (q), reorder (r), price (p)
{
    descrip = new char[strlen(d)+1]; // need the +1 for string terminator
    strcpy(descrip, d);
} // Initialization list



//Derived Auto Class
class Auto : public Inventory {
    char *dealer;
public:
    Auto(int q, int r, double p, char * d, char *dea); // constructor
    ~Auto(); // destructor
    void print();
    char * get_dealer() { return dealer; }
};
Auto::Auto(int q, int r, double p, char * d, char * dea) : Inventory(q, r, p, d) // base constructor
{
    dealer = new char(strlen(dea)+1); // need +1 for string terminator
    strcpy(dealer, dea);
}

「Auto::Auto(intq、int r、double p、char * d、char * dea):Inventory(q、r、p、d)」という行が混乱しました。「Inventory(q、r 、p、d)"やっています。同様に、「Inventory :: Inventory(int q、int r、double p、char * d):quant(q)、reorder(r)、price(p)」の行で、彼がquantで何をしているのかわかりません。 (q)、再注文(r)、価格(p)。これらは、クラスでint quant、reorder、double priceとして定義されたものと同じ変数ですか?もしそうなら、なぜ彼はコンストラクターで使用しなければならなかったのですか。そして、なぜ/どのように彼は「自動」クラスコンストラクターの定義を支援するために基本クラスのコンストラクターを使用したのですか。

4

2 に答える 2

5

彼は「初期化リスト」を使用しています。

彼は基本クラスのコンストラクターを呼び出しています。のパラメーター化されたコンストラクターを呼び出すクラスAuto::Auto(int q, int r, double p, char * d, char * dea) : Inventory(q, r, p, d)のコンストラクターを定義します。はパラメーター化されたコンストラクターを継承して定義するため、パラメーター化されたコンストラクターを呼び出す必要があります。C ++では、パラメーター化されたコンストラクターを定義すると、デフォルトコンストラクターがオーバーライドされ、そのクラスまたはサブクラスのオブジェクトをインスタンス化できる唯一の方法は、パラメーター化されたコンストラクターを呼び出す(または代替のデフォルトコンストラクターを定義する)ことです。AutoInventoryAutoInventoryInventory

の場合Inventory::Inventory(int q, int r, double p, char * d) : quant (q), reorder (r), price (p)、彼はフィールドquantreorderおよびをそれぞれpriceqで初期化しています。これは実際には省略形であり、代わりにコンストラクター本体で値を割り当てることができます(メンバーが定数でない場合)。rp

于 2012-12-05T01:35:18.073 に答える
4

子コンストラクターでは、デフォルトで常に父親のコンストラクターを呼び出します。そのコンストラクターが引数を受け取る場合は、:表記を使用して呼び出しを明示的に記述する必要があります。

于 2012-12-05T20:45:01.870 に答える