您的位置:首页 > 编程语言 > C语言/C++

C++类的访问控制

2016-09-14 16:00 141 查看

前言

C++类中关于访问说明符的关键字是public,protected和private,由于C++的继承的访问说明符不同,这里会牵扯出非常多不同的情况,本文尝试对此进行整理

无继承

public,protected和private这三个访问说明符其实是针对使用该类的代码而言的,如下

class Test {
public:
int a;
protected:
int b;
private:
int c;
}


其中a是可以又test实例化的对象访问的,而b和c是不行的

Test t;
t.a;    //合法
t.b;    //非法
t.c;    //非法


而对函数内部的方法而言,是可以访问所有数据成员的(这里不讨论静态与非静态的区别)

class Test {
public:
int a;
//方法可以访问所有数据成员
void f1() {
cout << a << endl;
}
void f2() {
cout << b << endl;
}
void f3() {
cout << c << endl;
}
protected:
int b;
private:
int c;
}


友元

一个类可以允许其他类或者函数访问他的非公有成员,方法时令其他类或者函数成为它的友元,定义友元也很方便,只要增加一条以friend开头的函数声明即可

class Test {
//声明函数f3为Test类的友元
friend void f3();
}


外部函数f3现在可以访问Test类的非公有成员了

访问控制与继承

每个类都可以控制它的成员对于派生类的可访问性

protected

protected说明符说明的是基类希望和派生类共享的成员,但是派生类及其友元只能访问派生类对象中的基类部分的受保护成员,也就是说它能访问的是继承下来的那个成员,它还是不能访问普通的基类对象中的受保护成员。这听起来有点绕,看下面的例子:

class Base {
protected:
int a = 100;
}
class Son : public Base {
protected:
int a = 200;
public:
//合法,输出200
void f1() {
cout << a << endl;
}
//合法,输出100
void f2() {
cout << Base::d << endl;
}
//非法,不能访问一般基类的受保护对象
void f3(Base& ba) {
cout << ba.d << endl;
}
}


公有,私有和受保护继承

一个类对其继承得到的成员的访问权限受两个因素影响:一是基类中该成员的访问说明符,二是派生列表中的访问说明符

看下面的例子:

class Base {
protected:
int pro_mem = 100;
private:
int pri_mem = 20;
public:
int pub_mem = 10;
};

class Pub_Son : public Base{
public:
//合法,输出10
void f1() {
cout << pub_mem << endl;
}
//合法,输出100
void f2() {
cout << pro_mem << endl;
}
//非法,派生类不能访问继承来的私有成员
void f3() {
cout << pri_mem << endl;
}

};

class Pub_Son : private Base{
public:
//合法,输出10
void f1() {
cout << pub_mem << endl;
}
//合法,输出100
void f2() {
cout << pro_mem << endl;
}
//非法,派生类不能访问继承来的私有成员
void f3() {
cout << pri_mem << endl;
}

};


由例子可见,派生访问说明符对于派生类的成员(及友元)能否访问其直接基类的成员没什么影响,对基类的访问权限只与基类中的访问说明符有关。

派生访问说明符的目的是控制派生类用户(也就是实例化的对象)对于基类成员的访问权限

看下面的例子

Pub_Son son1;
Pub_Son son2;
//合法
son1.pub_mem;
//非法
son2.pub_mem;


如果继承是共有的,那么成员将遵循其原有的访问说明符,此时pub_mem在son1中也是public的,所以可以直接访问。如果继承是私有的,那么在派生类中,父类的成员都是私有的,所以在son2中,pub_mem是私有的,所以无法直接访问。同理如果是受保护继承,那么在派生类中,父类的所有成员都是受保护的

可以参见下表:

<
4000
img src="https://img-blog.csdn.net/20160914155738008" alt="这里写图片描述" title="">

子类是继承了父类的私有成员的,但是这对子类是隐藏的,所以表中写了无。

此表转载自网络

总结一下就是记住几个基本的访问原则,然后记住三种继承的不同就可以了,遇到更复杂的可以到时候查一下工具书,死记硬背也没什么意义
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 继承 访问控制