1、派生类的公有数据访问基类中的公有数据
类外访问
如果能在类外访问代表以公有继承继承的基类公有的数据在派生类中的公有下放着。
先看一段代码:
#include <iostream>
using namespace std;
class A
{
public:
A(int a = 0, int b = 0,int c = 0) :ma(a), mb(b), mc(c){}
public:
int ma;
protected:
int mb;
private:
int mc;
};
class B : public A
{
public:
void Show()
{
/*cout << ma << endl;
cout << mb << endl;
cout << mc << endl;*/
}
};
int main()
{
B b;
cout << b.ma << endl;
//b.mb;
//b.mc;
return 0;
}
以上代码,在派生类中,B继承了A,相当于把ma,mb,mc都继承过来。如果在派生类类外还能访问的话,证明继承过来的数据就是在公有下放着。运行程序后结果如下:
以上代码运行证明可以在类外访问。说明基类中公有的数据在派生类中的访问也是公有的。
2、派生类的公有数据访问基类中的保护的数据
类外访问
看一段代码:
int main()
{
B b;
//cout << b.ma << endl;
cout << b.mb << endl;
//b.mb;
//b.mc;
return 0;
}
我们发现在类外无法访问继承过来的保护的数据。那就是有两种情况,基类中保护的数据以公有的继承方式继承过来的东西要么在私有下要么在保护下。那如何判别是在哪种方式下呢?
我们都知道protected的访问限定是:只允许在本类和子类中防伪标
先看下面一段代码:
```cpp
#include <iostream>
using namespace std;
class A
{
public:
A(int a = 0, int b = 0,int c = 0) :ma(a), mb(b), mc(c){}
public:
int ma;
protected:
int mb;
private:
int mc;
};
class B : public A
{
public:
void Show()
{
/*cout << ma << endl;
cout << mb << endl;
cout << mc << endl;*/
}
};
class C : public B
{
public:
void Show()
{
cout << mb << endl;
}
};
int main()
{
B b;
//cout << b.ma << endl;
//cout << b.mb << endl;
//b.mb;
//b.mc;
C c;
c.Show();//c调用Show函数如果调用成功则在保护下,调用不成功则在私有下
return 0;
}
``
我们现在派生一个C类,如果C里面能访问则代表的是这个数据在保护下,如果不能访问则代表这个数据在私有下。
我们发现可以访问成功,那证明以公有的继承方式来继承的时候基类中保护的数据就被放在了基类的保护的访问限定符下了。
3、派生类的公有数据访问基类中的私有数据
类外访问
int main()
{
B b;
//cout << b.ma << endl;
//cout << b.mb << endl;
cout << b.mc << endl;
//b.mb;
//b.mc;
C c;
//c.Show();//c调用Show函数如果调用成功则在保护下,调用不成功则在私有下
return 0;
}
我们发现无法访问成功。证明基类中私有的数据在派生类中要么是在保护下要么是在私有下。
继续看下面的代码:
class C : public B
{
public:
void Show()
{
cout << mc << endl;
}
}
我们只需看mc能不能被打印就可以看出来是不是被保护的数据。
我们发现也无法访问。说明私有的数据是无法被派生的。
4、派生类的保护数据访问基类中的公有数据
类外访问
看代码:
class B : protected A
{
public:
void Show()
{
}
};
class C : public B
{
public:
void Show()
{
}
};
int main()
{
B b;
cout << b.ma << endl;
return 0;
}
我们发现是无法访问的。则证明以保护继承来继承基类的公有的数据的时候在派生类里面访问限定没有在公有下,那么不是保护就是私有。
现在我们在C 类中打印ma ,如果能打印成功则是在保护下。
class C : public B
```cpp
{
public:
void Show()
{
cout << ma << endl;
}
};
int main()
{
C c;
c.Show();//c调用Show函数如果调用成功则在保护下,调用不成功则在私有下
return 0;
}
我们发现可以访问成功,证明以保护继承的方式继承基类中的公有的数据的话会把数据放在派生类的保护限定符下。
5、派生类的保护数据访问基类中的保护数据
类外访问
int main()
{
B b;
cout << b.mb << endl;
return 0;
}
我们发现是无法访问的。就说明不是在保护下就是在私有下。如何证明,看如下代码:
class C : public B
{
public:
void Show()
{
cout << mb << endl;
}
};
int main()
{
C c;
c.Show();//c调用Show函数如果调用成功则在保护下,调用不成功则在私有下
return 0;
}
我们发现可以访问成功。证明以保护方式继承基类中保护的成员是在派生类中的保护的访问限定符下。
6、派生类的私有数据访问基类中的公有数据
经过代码的调式我们发现是无法访问的。那就说明可能是在派生类的保护下或者派生类的私有下。
class C : public B
{
public:
void Show()
{
cout << ma << endl;
}
};
int main()
{
B b;
cout << b.ma << endl;
C c;
c.Show();//c调用Show函数如果调用成功则在保护下,调用不成功则在私有下
return 0;
}
我们发现也是无法访问的。就不在派生类的保护访问限定下。那么在自己本类类中可以不可以访问呢
class B : protected A
{
public:
void Show()
{
cout << ma << endl;
}
};
class C : public B
{
public:
void Show()
{
}
};
int main()
{
B b;
b.Show();
return 0;
}
我们发现是可以访问成功的。证明以私有的继承继承基类中的公有的数据是在派生类的私有下的。
7、派生类的私有数据访问基类中的保护数据
经过调试我们发现在类外是无法访问的,也不是在派生类中的保护下的。证明基类中保护的数据以私有的继承方式来继承的时候是在派生类中的私有访问限定符下。
8、总结
因为private的访问限定是:只允许在本类类中访问。所以派生类中以任何一种方式来继承基类中的私有数据的时候都是无法访问的。