保护成员

所谓“保护成员”,就是介于“公开成员”和“私有成员”之间的一种成员。

在类的派生过程当中,“基类的私有成员对派生类不可见”这个设定有的时候很让人头疼。假设某个基类中的成员,派生类中需要对其访问,但它又不方便完全公开;那么就需要用到保护成员了。

保护成员是指访问修饰符为 protected 的那些成员。它的访问范围和私有成员基本一致,唯有一个例外:其派生类对象可以访问它。

class Base {
private:
    int privateMem;
protected:
    int protectedMem; // 保护成员
public:
    int publicMem;
};
class Derived : public Base {
    void f() {
//      this->privateMem++;   // 私有成员不可访问
        this->protectedMem++; // 但保护成员可访问
    }
};
int main() {
    Derived d;
    // 在类外,保护成员和私有成员访问性质相同
//  d.privateMem++;
//  d.protectedMem++;
    d.publicMem++;
}

而且,保护成员仅仅放开了“自己的派生类对象”的访问权限,而没有放开“其它派生类对象”的访问权限。

class Base {
protected:
    int mem;
};
class Derived : public Base {
    void f(Base& another) {
        this->mem++; // OK,可以访问“自己的”
//      another.mem++; // 错误:不能访问“别人的”
    }
};

这是因为:如果容许这样做的话,那么实质上就相当于可以更改任何继承了 Base 类对象的“基类部分”成员——有点过于“公开”了。

当一个保护成员被公开继承的时候,它仍然是派生类的保护成员。所以派生类的派生类仍然可以访问:

class A {
protected:
    int mem;
};
class B : public A {}; // B 是 A 的派生类(公开继承,B 的 mem 是保护成员)
class C : public B {   // C 是 A 的派生类的派生类
    void f() {
        this->mem++; // OK
    }
};

当一个保护成员被私有继承的时候,它就是派生类的私有成员了。

类似地,除了公开继承、私有继承还有保护继承。它的效果可以参考上一节的表格。

保护成员和保护继承并不重要(除非备考,否则不用背),但是在日常的使用中有一定可能会用到。

最近更新:
代码未运行