前言

C++中,publicprivateprotected是三个重要的访问修饰符,它们用于控制类成员的访问权限。

下面简单记录一下相关知识,记录于此,方便自己查阅。

正文

为了验证权限,下面写demo进行测试。

访问范围

private

私有属性,即类成员对外不可见,对内可见。此为默认属性,未指定访问属性的成员会被默认为是private属性。

protected

保护属性,即成员对外不可见,对内可见,对派生类可见。

public

公有属性,即类成员对外可见,对内也可见。

测试

测试1

分别定义不同访问权限的int类型变量

class BiuParent{
private:
    int biu_field_private;
    void biu_fun_private() {
        std::cout << "biu_fun_private" << biu_field_private << std::endl;
        std::cout << "biu_fun_private" << biu_field_protected << std::endl;
        std::cout << "biu_fun_private" << biu_field_public << std::endl;
    }
protected:
    int biu_field_protected;
    void biu_fun_protected() {
        std::cout << "biu_fun_protected" << biu_field_private << std::endl;
        std::cout << "biu_fun_protected" << biu_field_protected << std::endl;
        std::cout << "biu_fun_protected" << biu_field_public << std::endl;
    }
public:
    int biu_field_public;
    void biu_fun_public() {
        std::cout << "biu_fun_public" << biu_field_private << std::endl;
        std::cout << "biu_fun_public" << biu_field_protected << std::endl;
        std::cout << "biu_fun_public" << biu_field_public << std::endl;
    }
    BiuParent() {
        biu_field_private = 1;
        biu_field_protected = 2;
        biu_field_public = 3;
        std::cout << "BiuParent()---> biumall.com" << std::endl;
    }
};

类中可以访问private,protected和public的属性。当然方法也是可以的,上面没有体现。

int main()
{
    BiuParent biuParent;
    //std::cout << biuParent.biu_field_private << std::endl;  // 不可访问
    //std::cout << biuParent.biu_field_protected << std::endl; // 不可访问
    std::cout << biuParent.biu_field_public << std::endl;  //可以访问
    //biuParent.biu_fun_private();  //不可调用
    //biuParent.biu_fun_protected(); //不可调用
    biuParent.biu_fun_public();  //可以调用
}

类对象除了public的变量可以访问,其他private和protected变量都不可以访问。

测试2

子类以private方式继承

class BiuSon : private BiuParent {
public:
    BiuSon() {
        std::cout << "BiuSon()---> biumall.com"<< std::endl;
        //biu_field_private = 4; //不可以访问
        biu_field_protected = 5;
        biu_field_public = 6;
        //biu_fun_private(); //不可以访问
        biu_fun_protected();
        biu_fun_public();
    }
};

或者以protected方式继承(因为效果一样,所以都放一起对比了)

class BiuSon : protected BiuParent {
public:
    BiuSon() {
        std::cout << "BiuSon()---> biumall.com"<< std::endl;
        //biu_field_private = 4; //不可以访问
        biu_field_protected = 5;
        biu_field_public = 6;
        //biu_fun_private(); //不可以访问
        biu_fun_protected();
        biu_fun_public();
    }
};

可以看出,使用private或protected修饰继承方式,父类中private修饰的成员不可以访问,其他的均可以访问。

继续看子类对象访问情况:

int main()
{
    BiuSon biuSon;
    //std::cout << biuSon.biu_field_private << std::endl;  // 不可访问
    //std::cout << biuSon.biu_field_protected << std::endl; // 不可访问
    //std::cout << biuSon.biu_field_public << std::endl;  //不可访问
    //biuSon.biu_fun_private();  //不可调用
    //biuSon.biu_fun_protected(); //不可调用
    //biuSon.biu_fun_public();  //不可调用
}

子类对象无法访问父类的任意成员。

测试3

以public方式继承

class BiuSon : public BiuParent {
public:
    BiuSon() {
        std::cout << "BiuSon()---> biumall.com"<< std::endl;
        //biu_field_private = 4; //不可以访问
        biu_field_protected = 5;
        biu_field_public = 6;
        //biu_fun_private(); //不可以访问
        biu_fun_protected();
        biu_fun_public();
    }
};

上面以public,访问,对于父类private修饰的属性和方法依旧不可以访问。

继续看子类对象访问情况:

int main()
{
    BiuSon biuSon;
    //std::cout << biuSon.biu_field_private << std::endl;  // 不可访问
    //std::cout << biuSon.biu_field_protected << std::endl; // 不可访问
    std::cout << biuSon.biu_field_public << std::endl;  //可访问
    //biuSon.biu_fun_private();  //不可调用
    //biu_fun_protected(); //不可调用
    biuSon.biu_fun_public();  //可调用
}

但对于子类对象来说,除了父类中public修饰的就可以访问了,其他的都不允许。

测试4

除了public方式继承,还有一种是默认方式继承,也就是不写修饰符。

class BiuSon : BiuParent {
public:
    BiuSon() {
        std::cout << "BiuSon()---> biumall.com" << std::endl;
        //biu_field_private = 4; //不可以访问
        biu_field_protected = 5;
        biu_field_public = 6;
        //biu_fun_private(); //不可以访问
        biu_fun_protected();
        biu_fun_public();
    }
};

子类中出来private修饰的无法访问,其他的都可以。

继续看子类对象访问情况:

int main()
{
    BiuSon biuSon;
    //std::cout << biuSon.biu_field_private << std::endl;  // 不可访问
    //std::cout << biuSon.biu_field_protected << std::endl; // 不可访问
    //std::cout << biuSon.biu_field_public << std::endl;  // 不可访问
    //biuSon.biu_fun_private();  //不可调用
    //biu_fun_protected(); //不可调用
    //biuSon.biu_fun_public();  //不可调用
}

子类对象无法访问父类的任意成员。

小结

根据上面测试发现

  1. 使用private,public或protected修饰继承方式,父类中仅仅使用private修饰的成员不可以访问,其他的可以。

  2. 使用private,protected,或者默认方式的继承方式,子类的对象都不可以访问父类中的所有成员。

  3. 使用public修饰继承方式,子类对象仅可以访问父类中public修饰的成员。

参考文章

  1. c++ public private protected区别

相关文章

暂无评论

none
暂无评论...