【足迹C++primer】53、访问控制和继承

时间:2021-05-19 19:30:40

访问控制和继承

public: 公有类型
private: 私有类型
protected: 保护类型
当一个类的成员定义为public,就能够在类外访问,包括它的派生类。
当一个成员定义为private,它仅能在类内访问,不能被它的派生类访问。
当一个成员定义为proteced,它仅能在类内访问,但是能被它的派生类访问。
当一个成员没有指定访问说明符时,默认为private。


派生类成员或友元可以访问受保护的成员
但只有只有通过派生类对象来访问。

class Base
{
protected:
    int prot_mem;
};

class Sneaky : public Base
{
    friend void clobber(Sneaky&);   //这个可以访问prot_mem
    friend void clobber(Base&);     //不能访问prot_mem,这个不是Base的友元
    int j;  //默认private类型
};

void clobber(Sneaky &s) {s.j=s.prot_mem=0; cout<<"通过Sneaky友元调用Base的prot_mem"<<endl;}

//void clobber(Base &b) {b.prot_mem=0;}   //error,prot_mem是保护的外面无法访问

public, private, and protected 继承

class Base2
{
    friend class Pal;
public:
    void pub_mem() {}
protected:
    int prot_mem;
private:
    char priv_mem;
};

struct Pub_Derv : public Base2
{
    int f() {return prot_mem;}
//    char g() {return priv_mem;} error:这个是private的无法访问
};

struct Priv_Derv : private Base2
{
    //私有继承不影响派生类中的访问,只是Base对于Priv_Derv来说都是private的
    int f() const {return prot_mem;}
};

void fun1()
{
    Pub_Derv d1;
    Priv_Derv d2;
    d1.pub_mem();
//    d2.pub_mem();   error:这里是私有继承,对于Priv_Derv来说Base2里面的类都是private类型的
}

struct Derived_from_public : public Pub_Derv
{
    int use_base(){return prot_mem;}    //ok:protected in pub_Derv
};

这里有一个错误示范~~~
struct Derived_from_private : public Priv_Derv
{
    int use_base(){return prot_mem;}    error:这里prot_mem是private类型
};

Friendship and Inheritance

友元函数可以访问该类的所有成员,但是没有访问该类派生类所有成员的权利
友元函数对于派生类来说就是在类的外部
class Base
{
    friend class Pal;
};

class Sneaky2 : public Base2
{
    int j;  //默认private类型
};


class Pal
{
public:
    int f(Base2 b) {return b.prot_mem;}
//    int f2(Sneaky s) {return s.j;}  error:Pal 不是Sneaky的友元
    int f3(Sneaky2 s2) {return s2.prot_mem;}    //不要惊讶,这是对的
};

class D2 : public Pal
{
public:
//    int mem(Base2 b){return b.prot_mem;}    error: 友元是无法继承的!!!

};

友元不是继承,每个类控制访问其成员,友元也不能继承。

Exempting Individual Members

class Base3
{
    friend class Pal;
public:
    size_t size() const {return n;}
    void pub_mem() {}
protected:
    size_t n;
    int prot_mem;
private:
    char priv_mem;
};

class Derved : private Base3
{
public:
    using Base3::size;  //用using改变访问权限
protected:
    using Base3::n;
};

用using 调整这些成员的访问权限

Default Inheritance Protection Levels(默认继承保护级别)

一个私人的派生类应明确指定私人而不是依靠
默认。明确表明私有继承的目的是
不要疏忽

the all code!

/**
* 功能:访问控制和继承
* 时间:2014年7月21日17:22:50
* 作者:cutter_point
*/

#include<iostream>
#include<algorithm>

using namespace std;
/*
public: 公有类型
private: 私有类型
protected: 保护类型
当一个类的成员定义为public,就能够在类外访问,包括它的派生类。
当一个成员定义为private,它仅能在类内访问,不能被它的派生类访问。
当一个成员定义为proteced,它仅能在类内访问,但是能被它的派生类访问。
当一个成员没有指定访问说明符时,默认为private。
*/

/*
派生类成员或友元可以访问受保护的成员
但只有只有通过派生类对象来访问。
*/
class Base
{
protected:
    int prot_mem;
};

class Sneaky : public Base
{
    friend void clobber(Sneaky&);   //这个可以访问prot_mem
    friend void clobber(Base&);     //不能访问prot_mem,这个不是Base的友元
    int j;  //默认private类型
};

void clobber(Sneaky &s) {s.j=s.prot_mem=0; cout<<"通过Sneaky友元调用Base的prot_mem"<<endl;}

//void clobber(Base &b) {b.prot_mem=0;}   //error,prot_mem是保护的外面无法访问

/**
public, private, and protected 继承
*/
class Base2
{
    friend class Pal;
public:
    void pub_mem() {}
protected:
    int prot_mem;
private:
    char priv_mem;
};

struct Pub_Derv : public Base2
{
    int f() {return prot_mem;}
//    char g() {return priv_mem;} error:这个是private的无法访问
};

struct Priv_Derv : private Base2
{
    //私有继承不影响派生类中的访问,只是Base对于Priv_Derv来说都是private的
    int f() const {return prot_mem;}
};

void fun1()
{
    Pub_Derv d1;
    Priv_Derv d2;
    d1.pub_mem();
//    d2.pub_mem();   error:这里是私有继承,对于Priv_Derv来说Base2里面的类都是private类型的
}

struct Derived_from_public : public Pub_Derv
{
    int use_base(){return prot_mem;}    //ok:protected in pub_Derv
};

/*
struct Derived_from_private : public Priv_Derv
{
    int use_base(){return prot_mem;}    error:这里prot_mem是private类型
};
*/

/**
Friendship and Inheritance
*/
/*
友元函数可以访问该类的所有成员,但是没有访问该类派生类所有成员的权利
友元函数对于派生类来说就是在类的外部
*/
/*
class Base
{
    friend class Pal;
};
*/

class Sneaky2 : public Base2
{
    int j;  //默认private类型
};


class Pal
{
public:
    int f(Base2 b) {return b.prot_mem;}
//    int f2(Sneaky s) {return s.j;}  error:Pal 不是Sneaky的友元
    int f3(Sneaky2 s2) {return s2.prot_mem;}    //不要惊讶,这是对的
};

class D2 : public Pal
{
public:
//    int mem(Base2 b){return b.prot_mem;}    error: 友元是无法继承的!!!

};

/*
友元不是继承,每个类控制访问其成员
*/

/**
Exempting Individual Members
*/
class Base3
{
    friend class Pal;
public:
    size_t size() const {return n;}
    void pub_mem() {}
protected:
    size_t n;
    int prot_mem;
private:
    char priv_mem;
};

class Derved : private Base3
{
public:
    using Base3::size;  //用using改变访问权限
protected:
    using Base3::n;
};

/*
用using 调整这些成员的访问权限
*/

/**
Default Inheritance Protection Levels(默认继承保护级别)
*/

/*
一个私人的派生类应明确指定私人而不是依靠
默认。明确表明私有继承的目的是
不要疏忽
*/

int main()
{

    system("pause");
    return 0;
}

人的贬值,不是年龄的贬值,是自我身价与姿态的贬值;一个人的衰老不是容颜的衰老,是进取心的衰老。一个人的不自信,不是自卑心作怪,是过于贬低自己不相信自己:其实我可以不依靠别人做的会更好。岁月会告诉我们很多事,长得好没太大青春资本,人的资本是自身的历练和能力。

我觉得可以给大家一点有点意思的句子,说着无心,听者有意,也许有一句就是适合你,属于你,并且激励着你!!!