派生类的 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++ 构造函数,其中基类包含类成员的主要内容,如果未能解决你的问题,请参考以下文章