C++/C编程学习:梳理18—三种访问权限与三种继承方式

原文:https://blog.csdn.net/luoweifu/article/details/46953343

三种访问权限

我们知道C++中的类,有三种访问权限(也称作访问控制),它们分别是public、protected、private。要理解它们其实也很容易,看下面了一个例子。

class Person
{
public:
    Person(const string& name, int age) : m_name(name), m_age(age)
    {
    }

    void ShowInfo()
    {
        cout << "姓名:" << m_name << endl;
        cout << "年龄:" << m_age << endl;
    }

protected:
    string  m_name;     //姓名

private:
    int     m_age;      //年龄
};

子类:

class Teacher : public Person
{
public:
    Teacher(const string& name, int age, const string& title)
        : Person(name, age), m_title(title)
    {
    }

    void ShowTeacherInfo()
    {
        ShowInfo();                             //正确,public属性子类可见
        cout << "姓名:" << m_name << endl;        //正确,protected属性子类可见
        cout << "年龄:" << m_age << endl;     //错误,private属性子类不可见

        cout << "职称:" << m_title << endl;   //正确,本类中可见自己的所有成员
    }

private:
    string  m_title;        //职称
};

调用方:

void test()
{
    Person person("张三", 22);
    person.ShowInfo();                  //public属性,对外部可见
    cout << person.m_name << endl;      //protected属性,对外部不可见
    cout << person.m_age << endl;       //private属性,对外部不可见
}

总结

三种继承方式 

C++中继承的方式还有多种,也分别都用public、protected、private表示。这与Java不一样,Java只有继承的概念,默认是public继承的。 

1. 三种继承方式不影响子类对父类的访问权限,子类对父类只看父类的访问控制权。如下面三种继承方式都能访问父类中的public和protected成员。

2. 继承方式是为了控制子类(也称派生类)的调用方(也叫用户)对父类(也称基类)的访问权限。

public、protected、private三种继承方式,相当于把父类的public访问权限在子类中变成了对应的权限。 如protected继承,把父类中的public成员在本类中变成了protected的访问控制权限;private继承,把父类的public成员和protected成员在本类中变成了private访问控制权。
 

public继承:

class Teacher : public Person
{
public:
    Teacher(const string& name, int age, const string& title)
        : Person(name, age), m_title(title)
    {
    }

    void ShowTeacherInfo()
    {
        ShowInfo();                             //正确,public属性子类可见
        cout << "职称:" << m_title << endl;   //正确,本类中可见自己的所有成员
    }

private:
    string  m_title;        //职称
};

void TestPublic()
{
    Teacher teacher("李四", 35, "副教授");
    teacher.ShowInfo();
    cout << endl;
    teacher.ShowTeacherInfo();
}

private继承:

class Teacher : private Person
{
public:
    Teacher(const string& name, int age, const string& title)
        : Person(name, age), m_title(title)
    {
    }

    void ShowTeacherInfo()
    {
        ShowInfo();                             //正确,public属性子类可见
        cout << "职称:" << m_title << endl;   //正确,本类中可见自己的所有成员
    }

private:
    string  m_title;        //职称
};
//
void TestPrivate()
{
    Teacher teacher("李四", 35, "副教授");
    teacher.ShowInfo();             //错误,因为Teacher采用了private的继承方式,外部不可访问。
    cout << endl;
    teacher.ShowTeacherInfo();
}

protected继承:

class Teacher : protected Person
{
public:
    Teacher(const string& name, int age, const string& title)
        : Person(name, age), m_title(title)
    {
    }

    void ShowTeacherInfo()
    {
        ShowInfo();                             //正确,public属性子类可见
        cout << "职称:" << m_title << endl;   //正确,本类中可见自己的所有成员
    }

private:
    string  m_title;        //职称
};
void TestProtected()
{
    Teacher teacher("李四", 35, "副教授");
    teacher.ShowInfo();         //错误,基类Person的ShowInfo此时对Teacher相当于protected的,外部不可以被访问
    cout << endl;
    teacher.ShowTeacherInfo();
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值