繁体   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