写在前面

这篇文章要分享的是父类的成员变量在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;
}