1

このコードを考えると

class Address
{
  private:
    char * streetName;
    int houseNumber;
  public:
    Address(char* strName, int houseNumber)
    {....}
 }

class Person
{
   protected:
       char *name, * phoneNumber;
       Address addr;
   public:
       Person(char* n, char* pN, char* stN, char* hsN): addr(stN,hsN)
       {
           //...... assign variable for person
       }      
};

class Officer: public Person
{
    private:
        double salary;
    public:
        // How to write the constructor??
        Officer(char* _name, char*_phoneNumber, char* _streetName, int _streetNumber, double _salary): .... ????
}

_streetName と _streetNumber が基本クラス Person に含まれるメンバー オブジェクト addr にフィードされる、5 つの入力変数を持つ派生クラス Officer のコンストラクターを作成する方法は?

4

4 に答える 4

5

class派生初期化子リストに基本メンバーを直接設定することはできません。

Officer(char* _name, char*_phoneNumber, char* _streetName, 
        int _streetNumber, double _salary):
     Person(_name, _phoneNumber, _streetName, _streetNumber),
     salary(_salary)
于 2012-05-18T10:30:46.790 に答える
2

クラスで見たのと同じアプローチがPersonここでも機能します。

    Officer(char* _name, char*_phoneNumber, char* _streetName, int _streetNumber, double _salary):
       Person(_name, _phoneNumber, _streetName, _streetNumber) {}

C++ では、親クラスのメンバー変数を初期化できません。これらがその理由です

  • カプセル化を壊してしまいます。OOP の考え方は、クラスに対してできることはすべてそのインターフェースからアクセスできるということです (この場合、初期化はコンストラクターによって行われます)。これは親クラスのコードと一致していることに注意してください。これは、addr渡したものによってメンバーを喜んで初期化します。
  • C++ には初期化の順序があり、親が最初に初期化され、(任意のクラスと同様に) 親がコンストラクター コードを実行する直前にメンバー変数を初期化することを指定します。子から「注入」された初期化を実行する場所がありません。
  • 初期化が確実に 1 回だけ実行されるようにするには、問題が発生する可能性があります。子が一部のメンバー自体を初期化したい (または既に初期化している) ことを追跡するのは悪夢です。
于 2012-05-18T10:31:38.297 に答える
1

次のようにコンストラクターを呼び出すことができます。

役員(char* _name, char*_phoneNumber, char* _streetName, int _streetNumber, double _salary): Person(char* _name, char*_phoneNumber, char* _streetName, int _streetNumber),salary(salary){}

于 2012-05-18T10:43:44.427 に答える
0

まず、役員も人であることを知っておく必要があります。あなたが直接行われた役員のためにすべてのことをしなければならないことを意味します。

したがって、役員のコンストラクターは、以下のように個人のコンストラクターを内部的に呼び出す必要があります。

Officer(char* _name, char*_phoneNumber, char* _streetName, int _streetNumber, double _salary):Person(_name, _phoneNumber, _streetName, _streetNumber)

ここで、salary.soの値も作成する必要があります。コンストラクターは次のようになります。

    Officer(char* _name, char*_phoneNumber, char* _streetName, int _streetNumber, double _salary):Person(_name, _phoneNumber, _streetName, _streetNumber),salary(_salary)
{}
于 2012-05-18T10:39:36.753 に答える