簡體   English   中英

派生類的C ++構造函數,其中基類包含類成員

[英]C++ Constructor for derived class where base class contain a class member

給定此代碼

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): .... ????
}

如何編寫具有五個輸入變量的派生類Officer的構造函數,其中_streetName和_streetNumber將被饋送到基類Person中包含的成員對象addr中?

您不能直接在派生class初始化器列表中設置基本成員。

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

您在Person類中看到的相同方法也可以在這里使用:

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

您無法在C ++中初始化父類的成員變量。 這些是原因

  • 這會破壞封裝,OOP的想法是,您可以對類進行的所有操作都可以通過其接口訪問(在這種情況下,初始化將由構造函數完成)。 請注意,這與您的父類的代碼一致,該代碼將通過您傳遞給它的任何東西來愉快地初始化addr成員。
  • C ++中有一個初始化順序,該順序指定先初始化父級,然后父級(與任何類一樣)在運行其構造函數代碼之前初始化其成員變量。 不會有從孩子那里“注入”初始化的地方來運行
  • 確保初始化只能運行一次會出現問題。 這可能是噩夢般的跟蹤,表明孩子想(或已經)自己初始化了一些成員

您可以這樣調用構造函數:

人員(char * _name,char * _phoneNumber,char * _streetName,int _streetNumber,雙_salary):人員(char * _name,char * _phoneNumber,char * _streetName,int _streetNumber),薪水(薪水){}

首先,您需要知道軍官也是一個人。 意味着您必須為親自完成的軍官做所有的事情。

因此您的官員構造函數應在內部調用人員的構造函數,如下所示:

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

現在您還必須構造薪水的值,因此您的構造函數將變為:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM