在 C++ 中实现复制控制时如何处理基类的私有成员?

How to handle private members of a base class when implementing copy control in C++?

提问人:chickennuggies 提问时间:4/19/2022 更新时间:4/19/2022 访问量:44

问:

给定派生自 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?

C++ 继承 复制构造函数赋 值运算符

评论

0赞 aschepler 4/19/2022
这看起来像是零法则的一个案例。只要根本不声明或定义复制构造函数或赋值运算符,就会发生正确的事情。
0赞 Peter 4/19/2022
另外,为什么 a 会派生自 ?公共继承通常表示 is-a 关系(例如,狗是一种动物,因此类将从 )。A 不是 的类型。TeacherFacultyDogAnimalTeacherFaculty

答:

2赞 zdan 4/19/2022 #1

是否需要此行,或者副本的名称是否已设置为 rhs.name 通过初始化列表,Faculty(rhs)?

否,不需要该行(假设是默认的或正确实现的复制构造函数)。构造函数将为您正确分配或初始化。FacultyFacultyname

如果我直接在 老师的私人领域?

是的,有点。但它将是一个完全独立的 .你不想这样做。您只需要定义一次。namename

评论

0赞 chickennuggies 4/19/2022
如果您不介意,请问一个后续问题,我的 Teacher 构造函数是否会将名称作为参数,因为它无法访问它?会是 1 吗?Teacher(string name) : Faculty(name) {} 或 2.Teacher() : 教师(姓名) {}?谢谢。
0赞 zdan 4/20/2022
是的,教师可以在其构造函数中接受名称并将其传递给基类。所以 1 是正确的。