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

C++ Constructor for derived class where base class contain a class member

本文关键字:基类 包含类 成员 派生 构造函数 C++      更新时间:2023-10-16

给定此代码

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++ 中有一个初始化顺序,它指定首先初始化父级,父级(与任何类一样(在运行其构造函数代码之前初始化其成员变量。没有地方让从子级"注入">
  • 初始化来运行
  • 确保初始化运行一次且仅运行一次会出现问题。这将是一场噩梦跟踪,孩子想要(或已经(初始化一些成员本身

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

官员(字符* _name, 字符*_phoneNumber, 字符* _streetName, 国际_streetNumber, 双_salary(:Person(char* _name, char*_phoneNumber, char* _streetName, int _streetNumber(,salary(salary({}

首先,

您需要知道军官也是一个人。意味着您必须为亲自完成的军官做所有事情.

因此,您的官员构造函数应在内部调用 Person 的构造函数,如下所示:

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)
{}