2012-05-18 54 views
1

鑑於這種代碼C++構造派生類,其中基類包含一個類的成員

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?

+2

注意,使用'std :: string'而不是'char *'。 – hmjd

+3

你有什麼嘗試?我沒有看到阻止你在初始化列表中使用父構造函數的任何事情。 – Mat

+0

http://stackoverflow.com/questions/120876/c-superclass-constructor-calling-rules AND http://stackoverflow.com/questions/2290733/initialize-parents-protected-members-with-initialization-list-c –

回答

5

您無法直接在派生的class初始化列表中設置基本成員。

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

如您在Person類在這裏看到過將工作相同的方法:

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

不能初始化父類的成員變量在C++中。這些都是對於

  • 它會破壞封裝的原因,OOP的想法是,everyithing你可以做一個類將是由它的接口訪問(在這種情況下,初始化將通過構造函數中完成)。請注意,這與您父母班級的代碼一致,該代碼將通過您傳遞給它的任何內容來愉快地初始化addr成員。
  • 在C++中有一個初始化的順序,它指定父對象首先被初始化,父對象(作爲任何類)在其構造器代碼運行之前初始化它的成員變量。將不會有一個地方爲孩子運行初始化「注入」
  • 會有問題確保初始化只運行一次。這將是一個噩夢跟蹤,孩子想(或已經)初始化一些成員本身
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) 
{} 
1

你可以調用這樣的構造函數:

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

相關問題