C++的三种访问权限与三种继承方式

三种访问权限

我们知道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++类三种方式控制权限总结如下,这与Java中的三种对应的访问权限是一样的。

访问权限 public protected private
对本类 可见 可见 可见
对子类 可见 可见 不可见
对外部(调用方) 可见 不可见 不可见

三种继承方式

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

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

class Teacher : /*public*/ /*protected*/ private 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;        //职称
};

.

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

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();
}

结果:

姓名:李四

年龄:35

姓名:李四

年龄:35

职称:副教授

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();
}

.

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

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();
}
class Leader : public Teacher
{
public:
    Leader(const string& name, int age, const string& title, string position)
        : Teacher(name, age, title), m_position(position)
    {
    }

    void ShowLeaderInfo()
    {
        ShowInfo();             //基类Person的ShowInfo此时相当于protected的,但子类仍可以访问
        ShowTeacherInfo();      //ShowTeacherInfo仍然是public的,可以访问
        cout << m_position << endl;
    }

private:
    string m_position;
};

版权声明:本文为博主原创文章,未经博主允许不得用于任何商业用途,转载请注明出处。

时间: 2024-10-26 08:18:50

C++的三种访问权限与三种继承方式的相关文章

apache(OS 10013)以一种访问权限不允许的方式做了一个访问套接字的尝试 ...

今天启动apache时,报了“(OS 10013)以一种访问权限不允许的方式做了一个访问套接字的尝试. : make_sock: could not bind to address 0.0.0.0:80”的错误.从网上查是是端口冲突,仔细检查发现80端口被IIS占用了. 解决方法:改端口号,打开.\apache\conf\httpd.conf,将其中的监听端口,由80改为81, # Change this to Listen on specific IP addresses as shown b

未经处理的异常:System.Net.Sockets.SocketException: 以一种访问权限不允许的方式做了一个访问套接字的尝试

报错:未经处理的异常:System.Net.Sockets.SocketException: 以一种访问权限不允许的方式做了一个访问套接字的尝试 → 尝试以"管理员身份"运行程序,不行.→ 点击菜单下的"运行",输入"cmd",来到控制台.→ 输入"netstat -a"查看端口是否被占用,发现应用程序中所使用的端口已被占用.→ 更改应用程序的端口,问题解决.

启动django应用报错 “Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。”

启动django应用时报如下错误 "Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试." 网上查了一下,是8000端口被其他程序占用了,杀掉占用的程序就可以 (1)查找哪个进程占用了8000端口 E:\sign_system\guest>netstat -ano|findstr 8000 (2)找出对应pid的进程详细信息 E:\sign_system\guest>tasklist |findstr 5516 (3)杀掉该进

三种继承方式和三种访问权限

 也就是说子类只能访问父类的保护和公有成员,而对象只能访问公有成员. 继承方式 1. 三种继承方式不影响子类对父类的访问权限,子类对父类只看父类的访问控制权.     2. 继承方式是为了控制子类(也称派生类)的调用方(也叫用户)对父类(也称基类)的访问权限. 3. public.protected.private三种继承方式,相当于把父类的public访问权限在子类中变成了对应的权限. 如protected继承,把父类中的public成员在本类中变成了protected的访问控制权限:priv

Think in Java(三):访问权限控制

1. 一个java文件中可以有多个类,但只能有一个public的类. 2. 类既不可以是private的,因为这会使得除该类职位,其他任何类都不可以访问它,也不可以是protected,所以对于类的访问权限只能是包访问权限或public.(一个内部类可以是private或protected) 3. 访问权限 public > friendly > protected > private

java四种访问权限修饰符

java中四个访问权限修饰符: public(公开的).protected(受保护的).default(默认的).private(私有的). 它们决定了紧跟其后被定义的东西的使用范围. 适用范围<访问权限范围越小,安全性越高>  访问权限   类   包  子类  其他包   public     ∨   ∨    ∨     ∨          (对任何人都是可用的)  protect    ∨   ∨   ∨     × (同一个包内其他类和继承的类可以访问)  default    ∨

Java之访问权限控制符以及结合继承体系引发的注意事项

访问修饰符的作用域: private:可以定义方法或者属性,定义的方法和属性不能被外部的类所访问(包括子类). default:可以在本包中的任意地方访问. protected:保护,不同包中的非子类不能访问.(能访问的成员包括相同包以及该类的任意子类) public:公共的,都可以访问,不受任何限制. Java继承&访问修饰符结合使用引发的大混乱 1.子类重载方法的权限是否允许小于父类定义?其中,private<default<public 不允许,注:Java中允许Parent  

开启mysql远程连接访问权限的几种方法

1.改表法. 可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 "user" 表里的 "host" 项,从"localhost"改称"%" mysql -u root -pvmware//账号root,密码vmwaremysql>use mysql; mysql>update user set

安装 Apache 出现 &lt;OS 10013&gt; 以一种访问权限不允许的方式做了一个访问套接字的尝试

如下截图: 提示: make_sock: could not bind to address 0.0.0.0:80 这个问题有由于计算机上安装了IIS7,80端口已占用.打开Apache 的配置文件  Apache安装目录下的conf/httpd.conf找到Listen 80 将80改为 88 重启Apache访问 http://localhost:88