类的访问权限和派生继承时的访问权限
来源:互联网 发布:sql替换语句 编辑:程序博客网 时间:2024/06/05 07:10
在C++的类的数据成员的访问权限分为三种:public、protect和private。
private表示自己本类私有,不允许其它类的直接访问;
protected表示自己及子孙可以访问,其它族类不允许直接访问,我们可以把它比作是本家族的共同财富;
public表示向全社会都公开的,任何类都可以直接访问的。
PS:private限制的是其他类的访问权限,本类内部可以访问。包括函数参数传进来的本类的形式参数对象。
一般来说,位于private当中的成员外界无法访问,哪怕是继承自父类的子类,也不可能轻易地访问到父类的private成员。
但是今天注意到一个例外。那就是当本类的成员函数所接受的参数为同类对象时,该成员函数内部可以直接访问参数对象的私有成员。
比如说:
class A
{
private:
int a;
public:
void tt(A b);
};
void A::tt(A b)
{
b.a++;
}
上述代码的tt()函数是A的成员函数,a是A的私有成员,但传入给A的b对象的私有成员却是可以直接在tt函数当中使用的。如果参数是同类对象的引用、指针,情况也完全相同。这个可能为了方便类似拷贝构造函数而实现的一个小“缺口”。简而言之,类成员的权限是在类与类之间建立的关系,而不是对象与对象之间。
不过如果自己是一个子类,而父类作为参数传入的时候,父类的私有成员不能享受这样的偷渡待遇。
当一个子类从父类继承时,父类的所有成员成为子类的成员,此时对父类成员的访问状态由继承时使用的继承限定符决定。
1.如果子类从父类继承时使用的继承限定符是public,那么
(1)父类的public成员成为子类的public成员,允许类以外的代码访问这些成员;
(2)父类的private成员仍旧是父类的private成员,子类成员不可以访问这些成员;
(3)父类的protected成员成为子类的protected成员,只允许子类成员访问;
2.如果子类从父类继承时使用的继承限定符是private,那么
(1)父类的public成员成为子类的private成员,只允许子类成员访问;
(2)父类的private成员仍旧是父类的private成员,子类成员不可以访问这些成员;
(3)父类的protected成员成为子类的private成员,只允许子类成员访问;
3.如果子类从父类继承时使用的继承限定符是protected,那么
(1)父类的public成员成为子类的protected成员,只允许子类成员访问;
(2)父类的private成员仍旧是父类的private成员,子类成员不可以访问这些成员;
(3)父类的public成员成为子类的protected成员,只允许子类成员访问;
至于类中不同成员(public、private和protected)的访问状态就不细说了。
c++访问权限和派生继承
在基类中,public表示成员是公有的:可以由程序中任何函数访问。所以公有成员一般是成员函数,它提供了外部程序与类的接口功能,用户通过公有成员访问该类对象中的数据。
protected:可以被1.该类中的函数、2.其友元函数访问 3.子类的函数。
public:可以被1.该类中的函数、2.其友元函数访问 3.子类的函数、也可以由4.该类的对象访问。
class A
{
private:
int a;
public:
int b;
protected:
int c;
};
A ca;
ca.a //error
ca.b // ok
ca.c //error
class B :public A
{
public:
int d;
}
B cb;
cb.b; //ok
cb.c //error。虽然c也是B的成员,但c在被继承的时候变成私有或者受保护的成员了。
注:友元函数包括3种:设为友元的普通的非成员函数;设为友元的其他类的成员函数;设为友元类中的所有成员函数。
class employee
{
};
class
{
};
分析派生新类这个过程,其继承和派生机制的主要目的是实现代码的重用和扩充。实际是经历了三个步骤:吸收基类成员、改造基类成员、添加新的成员。
1.吸收基类成员
第一步是将基类的成员全盘接收:包含了它的所有基类中除构造和析构函数之外的所有成员。
这里派生类technician继承了基类employee的除构造和析构函数以外的所有成员:
name;
pay();
经过派生过程,这些成员便存在于派生类之中。
2.改造基类函数
对基类成员的改造包括两个方面,
一个是基类成员的访问控制问题,主要依靠派生类声明时的继承方式来控制:
类的继承方式:public、protected和private三种访问属性。
第二个是对基类数据或函数成员的覆盖,
如果派生类声明了一个和某个基类成员同名的新成员(如果是成员函数,则参数表也要相同,
如pay();
3.添加新的成员
我们可以根据实际情况的需要,给派生类添加适当的数据和函数成员,来实现必要的新增功能。如technician派生类中的hourlyRate和workHours,在派生过程中,由于基类的构造函数和析构函数是不能被继承下来的,因此我们就需要在派生类重新加入新的构造函数和析构函数来实现一些特别的初始化和清理工作,例如派生类technician的构造函数technician();
第二:类的继承后方法属性变化。
private继承,父类的所有方法在子类中变为private;
protected继承,父类的protected和public方法在子类中变为protected,private方法不变;
public继承,父类中的方法属性不发生改变; 原来是怎样就怎样
public继承
protected继承
protected继承和private继承能降低访问权限。
如果使用私有继承: 在该例子和protected一样。
参考:http://jeromecx.blog.51cto.com/2599733/534757 jeromecx
http://www.cnblogs.com/liuyanghejerry/archive/2011/03/23/1992577.html liuyanghejerry
- 类的访问权限和派生继承时的访问权限
- 关于基类派生类的继承访问权限
- 在继承中派生类成员的访问权限测试
- 继承的访问权限
- 多级派生时的访问权限
- C++派生类的访问权限
- C++派生继承访问权限
- 派生类继承问题和访问权限问题
- 派生类对基类成员的访问权限和派生类对象对基类成员的访问权限
- c++的访问权限和继承方式
- 区分“派生类对象”和“派生类”对基类成员的访问权限
- 在继承中派生类成员函数的访问权限测试
- 继承时访问权限的趣事儿
- 类中公有继承的访问权限
- Swift - 类的继承 & 访问权限
- 继承类的访问权限问题
- 多继承时的同种和多种访问权限
- java中类之间的继承和访问权限
- 设置无网络连接情况下的虚拟机ssh访问
- List of Linux/i386 system calls
- my创建存储过程(基础2)
- HDOJ 1856 More is better
- 一道中兴试题的解析
- 类的访问权限和派生继承时的访问权限
- vi常用命令
- strcat()连接两个字符串的问题分析
- 用Jquery实现checkbox的反选、全选、全不选
- ural 1004(floyd 求最小环)
- USACO Section 1.2 Transformations
- javascript设置overflow-y
- Localization in XCode4
- 零值比较