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

Posted

技术标签:

【中文标题】派生类的 C++ 构造函数,其中基类包含类成员【英文标题】:C++ Constructor for derived class where base class contain a class member 【发布时间】:2012-05-18 10:26:13 【问题描述】:

鉴于此代码

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?

【问题讨论】:

旁注,使用std::string 而不是char* 你试过什么?我没有看到任何阻止你在初始化列表中使用父构造函数的东西。 ***.com/questions/120876/… AND ***.com/questions/2290733/… 【参考方案1】:

您不能直接在派生的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 的想法是,你可以对一个类做的所有事情都可以通过它的接口访问(在这种情况下,初始化将由构造函数完成)。请注意,这与您的父类的代码一致,它将通过您传递给它的任何内容来愉快地初始化 addr 成员。 在 C++ 中有一个初始化顺序,它指定首先初始化父级,而父级(与任何类一样)在运行其构造函数代码之前初始化其成员变量。不会有地方让孩子“注入”的初始化运行 确保初始化运行一次且仅运行一次会出现问题。孩子想要(或已经)自己初始化一些成员,这将是一场噩梦

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

首先你需要知道警官也是一个人。 意味着您必须亲自为军官做所有事情。

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

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)

【讨论】:

以上是关于派生类的 C++ 构造函数,其中基类包含类成员的主要内容,如果未能解决你的问题,请参考以下文章

C++中派生类的构造函数怎么显式调用基类构造函数?

C++入门派生类和基类的构造/析构函数关系

C++基类和派生类的构造函数

在其派生类C++的构造函数中调用基类的构造函数[重复]

C++中的派生类,可以不定义对象直接调用基类的成员和调用自己的成员函数嘛???

生成一个派生类对象时,调用基类和派生类构造函数按啥次序