public与protected到底是个什么关系

在类里面我在protected下定义了一个s_num,在public下写了showmenu为什么在类之外还是可以调用showmenu,里面的s_name不受protected控制吗

#include 
using namespace std;
double pi = 3.14;
class student
{
public:
    //属性
    string s_name;
protected:
    int s_num;
    //行为
public:
    void showmenu()
    {
        cout << "学生姓名   " << s_name << "   学生学号   " << s_num;
    }
}

public就是谁都可以访问,protected只能子类可以访问,外部类不能访问。showmenu是类函数,当然可以访问类里面任何的成员变量了。showmenu是public函数,所以外面是可以直接调用的

public:公有的,说明声明在public后面的成员所有人都是可以使用的,比如一个公有成员变量可以直接使用该类的对象"."出来这个成员,如果这个成员是protected和private都需要通过public的函数来访问这个成员。
protected:受保护的,类内和子类可直接访问,也就是说,基类中有protected成员,子类继承于基类,那么也可以访问基类的protected成员,要是基类是private成员,则对于子类也是隐藏的,不可访问。