写在前面
这篇文章要分享的是父类的成员变量在private,public,protected三种限制情况下的继承与约束关系。
内存关系
首先来看看,在继承的时候,父类的成员变量是以何种形式存在于子类的对象中的。
首先来看测试程序:
这段程序也比较好理解,首先我创建了一个A类,在A类里面有private,protected, public的成员变量int i,k,l。
然后测试程序用B类继承了A类,并且在B类的构造函数里面初始化了A类的成员变量,那么在A类的参数初始化表我对private,protected, public的变量赋予了不同的数值,应该分别是i(2),k(3),l(4),以便后期进行查验。
在B类自身的构造函数里面,将成员变量j初始化成了(1)。
好了,来到main函数里面的测试程序,我用一个int的指针指向对象的内存,并且用这个指针查看B类对象的内存内容,结果如下所示:
可以看到,是先输出了A类的成员变量,最后才是输出了B类的成员变量,那么也是可以从中看出子类的对象里面是会包含父类的private,protected, public的成员变量。
还可以看出父类的成员变量是排在子类的成员变量前面的,如下面这个结构图所示:
继承关系
那么我们来看子类对于private,protected, public的继承关系。
让我们来看看测试例程:
我在B类的构造函数里面进行了A类的成员变量的输出,结果如下所示:
可以看到正常输出了,现在取消注释:
可以看到编译器报错了,说明private在子类中是存在,但是不能访问的。
那让我们来看看,能否在B类的外面,也就是通过对象调用父类的protected和public的成员变量呢?测试看看:
可以看到,public可以正常输出,但是protected就会报错:
这说明,public的继承度最高,protected其次,private最低。
测试源码:
#include <iostream>
using namespace std;
class A
{
public:
int i;
A(int ii):i(++ii),k(++ii),l(++ii){}
protected:
int k;
private:
int l;
};
class B:public A
{
public:
int j;
B(int jj):A(jj),j(jj){
cout << "A::i is " << A::i << endl;
cout << "A::k is " << A::k << endl;
// cout << "A::l is " << A::l << endl;
}
};
int main()
{
B b(1);
int *pb = (int*)&b;
cout << "first int is " << *pb << endl;
pb += 1;
cout << "second int is " << *pb << endl;
pb += 1;
cout << "third int is " << *pb << endl;
pb += 1;
cout << "fourth int is " << *pb << endl;
cout << "b is going to do A::i is " << b.i << endl;
// cout << "b is going to do A::k is " << b.k << endl;
return 0;
}
评论(23)
您还未登录,请登录后发表或查看评论