1

鉴于此代码

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

4 回答 4

5

You can't set base members in derived class initializer lists directly.

Officer(char* _name, char*_phoneNumber, char* _streetName, 
        int _streetNumber, double _salary):
     Person(_name, _phoneNumber, _streetName, _streetNumber),
     salary(_salary)
于 2012-05-18T10:30:46.790 回答
2

您在课堂上看到的相同方法Person也适用于此处:

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

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

  • 它会破坏封装,OOP 的想法是你可以对一个类做的所有事情都可以通过它的接口访问(在这种情况下,初始化将由构造函数完成)。请注意,这与您的父类的代码一致,它将addr通过您传递给它的任何内容来愉快地初始化该成员。
  • 在 C++ 中有一个初始化顺序,它指定首先初始化父级,并且父级(与任何类一样)在运行其构造函数代码之前初始化其成员变量。不会有地方让孩子“注入”的初始化运行
  • 确保初始化运行一次且仅运行一次会出现问题。孩子想要(或已经)初始化一些成员本身将是一场噩梦
于 2012-05-18T10:31:38.297 回答
1

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

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

于 2012-05-18T10:43:44.427 回答
0

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

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

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)
{}
于 2012-05-18T10:39:36.753 回答