C ++派生类的构造函数,其中基类包含类成员

时间:2012-05-18 10:26:13

标签: c++ oop inheritance constructor

鉴于此代码

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?

4 个答案:

答案 0 :(得分:5)

您无法直接在派生的class初始值设定项列表中设置基本成员。

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

答案 1 :(得分:2)

您在Person课程中看到的方法也适用于此处:

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

您无法在C ++中初始化父类的成员变量。这些是原因

  • 它会打破封装,OOP的想法是你可以通过它的接口来访问你可以做的任何事情(在这种情况下,初始化将由构造函数完成)。请注意,这与您的父类的代码一致,无论您传递给它的是什么,它都会愉快地初始化addr成员。
  • C ++中有一个初始化顺序,它指定父进程首先被初始化,而父进程(如任何类)在运行其构造函数代码之前初始化其成员变量。没有地方可以从孩子那里“注入”初始化
  • 确保初始化只运行一次就会出现问题。这将是一个噩梦跟踪,孩子想要(或已经)初始化一些成员本身

答案 2 :(得分:1)

您可以像这样调用构造函数:

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

答案 3 :(得分:0)

首先你需要知道这位军官也是一个人。 意味着你必须为亲自完成的官员做所有的事情。

所以你的军官构造函数应该在内部调用person的构造函数,如下所示:

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

现在你还必须构造salary的值。所以你的构造函数变为:

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