提问人:chickennuggies 提问时间:4/19/2022 更新时间:4/19/2022 访问量:44
在 C++ 中实现复制控制时如何处理基类的私有成员?
How to handle private members of a base class when implementing copy control in C++?
问:
给定派生自 Faculty 类的 Teacher 类,我将如何处理 Teacher 对象的名称,该对象在 Faculty 中被定义为私有成员,但在 Teacher 中不被定义为私有成员,用于复制控制?
// example code for the two classes
class Faculty{
public:
/* constructor
copy constructor
destructor
assignment operator
*/
string get_name() const{
return name;
private:
string name;
};
class Teacher : public Faculty{};
假设 Faculty 类具有正常运行的复制控件
// Copy constructor
Teacher(const Teacher& rhs) : Faculty(rhs){
name = rhs.name;
}
此行不会编译,因为它尝试访问教职员工的私有成员。是否需要此行,或者副本的名称是否已被初始化列表 Faculty(rhs) 设置为 rhs.name?如果我直接在 Teacher 的私有字段中定义字符串名称,是否可以访问 name?
// Assignment operator
Teacher& operator=(const Teacher& rhs){
Faculty::operator=(rhs);
if(this != &rhs){
name = rhs.name; // same issue
}
return *this;
}
与复制控制相同的问题,是否需要这样做,或者名称是否已被 Faculty 类的分配运算符更改为 rhs.name?
答:
2赞
zdan
4/19/2022
#1
是否需要此行,或者副本的名称是否已设置为 rhs.name 通过初始化列表,Faculty(rhs)?
否,不需要该行(假设是默认的或正确实现的复制构造函数)。构造函数将为您正确分配或初始化。Faculty
Faculty
name
如果我直接在 老师的私人领域?
是的,有点。但它将是一个完全独立的 .你不想这样做。您只需要定义一次。name
name
评论
0赞
chickennuggies
4/19/2022
如果您不介意,请问一个后续问题,我的 Teacher 构造函数是否会将名称作为参数,因为它无法访问它?会是 1 吗?Teacher(string name) : Faculty(name) {} 或 2.Teacher() : 教师(姓名) {}?谢谢。
0赞
zdan
4/20/2022
是的,教师可以在其构造函数中接受名称并将其传递给基类。所以 1 是正确的。
上一个:使用链表的类队列的三分法则
下一个:在 C++ 中添加矩阵
评论
Teacher
Faculty
Dog
Animal
Teacher
Faculty