2012-05-18 9 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?

+2

Обратите внимание, используйте 'std :: string' вместо' char * '. – hmjd

+3

Что вы пробовали? Я не вижу ничего, что мешает вам просто использовать родительский конструктор в списке инициализаторов. – Mat

+0

http://stackoverflow.com/questions/120876/c-superclass-constructor-calling-rules И 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++. Эти причины для этого

  • Было бы нарушить инкапсуляцию, идея объектно-ориентированного программирования является то, что 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

Вы можете вызовите конструктор следующим образом:

Офицер (char * _name, char * _phoneNumber, char * _streetName, int _streetNumber, double _salary): Person (char * _name, char * _phoneNumber, char * _streetName, int _streetNumber), зарплата (зарплата) {}

Смежные вопросы