C++数据访问声明的思考

    首先我们都知道对于基类的私有数据或者接口,不论是何种的继承,这个数据永远属于这个基类,只有这一份属于这个基类所定义的对象,当然对于这个基类的对象这个数据可以有多份,但是对于类外的其他类来说就是只有一份,永远不能给派生类共享。派生类只能通过基类的方法进行访问。(这里首先不对友员函数进行讨论,暂时忽略)

    其次对于所有的数据如果使用私有继承,无论数据或接口在基类中的访问属性是什么,在经过这个私有继承之后就会全变成基类的私有成员

   下来对于基类的公有数据如果使用公有属性就会还是在派生类中是公有属性,如果使用保护继承就会变成派生类中的保护属性,就是只能在派生类中使用公有接口才可以访问

       对于基类的保护数据如果使用公有继承就还是在派生类中是保护属性,如果使用保护继承还是保持自身不变

      下来说一说各种的继承方式,对于私有继承就是好比告诉派生类我这边的东西(数据或者接口)只有我这一份,你想COPY,不给,但是我可以允许你在读或者写操作时候通过我给你提供的数据接口进行操作。对于保护继承就是告诉派生类我这边这个东西(数据或者接口)我可以拷贝一份给你,但是你必须珍惜这个我给你的东西,并且我的这些数据的访问权限你也不能更改,一定过去把他也保护起来。对于公有继承就是我公开的所有的并且也给你,你过去也必须将这些公开,但是我的数据原本的属性不可以更改。

     再说一说保护数据与私有数据。在设计的时候已经考虑到了,为了维护数据安全和共享就是出现了在公有数据与私有数据之间的一种保护数据,私有数据是只有自己类中一份,其他类想使用先要我同意才可以,必须走我的接口,而保护数据是继承类中可以和积累共同享用的私有数据,就是无论我被派生多少次,我的心还是不变我还是在你使用我的时候作为你的私有数据,哎呦,说的有点煽情了!!!


 前面我们知道对于公有的继承所有的基类公有接口也是派生类的公有接口,可以直接使用派生类中的对象直接调用基类的接口,但是保护继承所有的基类公有接口就会变成派生类中保护类型,这样派生类对象可以通过派生类中的公有接口访问基类的公有接口,还有对于私有继承,基类中的公有接口就会变成派生类中的私有数据,必须通过派生类的公有接口访问基类的公有接口(这里我只说找类的接口没有说找类的数据是因为找到接口,数据肯定找到)

所以下面我说的访问声明就是针对上面的保护继承和私有继承中访问基类的公有接口麻烦的解决,这样可以减少派生类中在构造一个公有函数来访问基类的公有接口,下面只以私有继承为例其实保护继承是一样的

/**********************************************************************     
* *   Copyright (c)2015,WK Studios   
* *   Filename:  A.h 
* *   Compiler: GCC  vc 6.0    
* *   Author:WK     
* *   Time: 2015 26 6  
* **********************************************************************/  
#include <iostream>
using namespace std;
class A
{
public:
	A(int x=int(),int x1=int(),int x2=int()):p_data(x),data(x1),m_data(x2)
	{

	}
	void show(int x)const
	{
		cout<<data+m_data-x<<"\n";
	}
	void show()
	{
		cout<<"data of protected: "<<data<<"  data of private: "<<m_data<<"\n";
	}

	int p_data;
protected:
	int data;
private:
	int m_data;
};
//想要在私有继承中访问基类的公有数据与接口,可以使用访问声明,只给声明的数据或接口一个后门可以访问,保护了数据的安全性
class B :private A
{
public:
    B(int x=int(),int x1=int(),int x2=int()):A(x,x1,x2)
	{

	}
	A::show;//这只是以函数名作为重载函数的匹配到函数,注意这里只需要函数名
	A::data;//数据与函数原来是什么访问属性使用访问声明之后在派生类中还是原来的属性
};
void main()
{
  B b1(1,2,3);
  b1.show();
  b1.show(1);
 cout<< b1.data<<endl; ;
  
}

其实我上边所表示的意思不是在继承的时候派生类不会继承也就是拷贝基类除了析构构造之外的所有数据,肯定会在派生类中也存在基类中的这些数据,只是可以理解为基类有时候不会给派生类使用,就好比只有自己有,下来用实例验证一下

#include<iostream>
using namespace std;

class A
{
public:
	A(int x=0):m_data(x)
	{
  cout<<"Constructor A!!!\n";
	}
private:
	int m_data;
};

class B:public A
{
public:
	B(int x=0,int y=0):A(x),data(y)
	{
       cout<<"Constructor B!!!\n";
	}
private:
	int data;
};
void  main()
{
   B b;

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值