C++类的继承(二)一文吃透继承

    大家好,这里是小张,今天继续给大家带来**类的继承**,上一次我们说到了什么叫做继承,和继承的一些语法,今天就由小张来继续给大家讲解一下继承的三种方式继承中的对象模型以及继承中的构造函数和析构函数的顺序,希望能够帮助到大家更好的理解类的继承。

        首先我们先来看继承的三种方式,继承分为公共继承,保护继承以及私有继承,父类中的私有属性在子类中谁也访问不到,如果是公共继承,父类的公共属性在子类中仍是公共属性,父类的保护属性在子类依然是保护属性,私有还是私有,如果是保护继承,父类的公共属性在子类中变成了保护属性,父类的保护属性在子类中还是是保护属性,私有还是私有(访问不到)如果是私有继承,父类的公共属性在子类中变成了私有属性,父类的保护属性在子类中也变成了私有属性,私有还是私有(访问不到),下面进行公共继承代码的验证:

#include<iostream>
using namespace std;
//继承方式
//这里是公共继承的实现
class Base1//父类
{
public:
	int m_A;
protected:
	int m_B;
private:
	int m_C;
};
class son1 :public Base1//公共继承的子类
{
public:
	void func()
	{
		m_A = 10;//可以访问父类的公共属性,不会报错,父类的公共权限到子类中还是公共权限
		m_B = 10;//父类的保护属性在子类依然是保护属性
		//m_C = 10;//父亲的私有属性,子类访问不到
	}
};
void test1()//测试案例1,公共继承
{
	son1 p;
	p.m_A = 100;//此时公共属性通过公共继承之后仍属于公共部分,还是可以访问到
	//p.m_A = 100;//此时虽然在son1类中是公共部分,但是父类的保护属性在子类依然是保护属性。还是访问不到,这里会报错
}
int main()
{
	test1();
	return 0;
}

下面是如果访问 p.m_B的报错提示,因为此时p.m_B还是私有成员,类外访问不到

 下面进行保护继承的代码验证

#include<iostream>
using namespace std;
//下面进行保护继承的实现
class Base2//第二个父类
{
public:
	int m_A;
protected:
	int m_B;
private:
	int m_C;
};
class son2 :protected Base2
{
public:
	void func2()
	{
		m_A = 100;//父类中公共成员到子类中变成保护属性
		m_B = 100;//父类的保护属性到子类中还是保护属性
		//m_C = 100;//虽然是继承但是私有属性在这里还是访问不到,会报错
	}
};
void test2()//测试案例2,保护继承
{
	son2 p;
	//p.m_A = 100;//这里直接就会报错,因为要是保护继承的话,到了子类里不管父类的继承方式是什么(除了私有成员)到了这里都是保护成员,类外访问不到
	//p.m_B = 100;//同样,B也访问不到,会报错
}
int main()
{
	test2();
	return 0;
}

下面是如果访问 p.m_A的报错提示,因为此时p.m_A变成了保护成员,类外访问不到

 

  下面进行私有继承的代码验证

#include<iostream>
using namespace std;
//下面进行私有继承的实现
class base3//第三个父类
{
public:
	int m_a;
protected:
	int m_b;
private:
	int m_c;
};
class son3 :private base3//私有继承
{
public:
	void fun3()
	{
		m_a = 100;//父类中公共成员到子类中变成私有属性
		m_b = 100;//父类的保护属性到子类中变成私有属性
		//m_c = 100;//虽然是私有继承但是私有属性在子类这里还是访问不到,会报错

	}
};
void test3()//测试案例3,私有继承
{
	son3 p;
	//p.m_a = 100;//同样,这里也会报错,因为要是私有继承的话,到了子类里不管父类的继承方式是什么(除了私有成员)到了这里都是私有成员,类外访问不到
	//p.m_b = 100;
}
int main()
{
	test3();
	return 0;
}

 下面是如果访问 p.m_A的报错提示,因为此时p.m_A变成了保护成员,类外访问不到

到这里就把继承的三种方式说完了,接下来我们进行 继承中的对象模型,我们由上面的知识可以知道,子类可以继承所有父类中公共的内容,那么此时的共有内容属不属于类的对象上面上呢,这是我们这里要考虑的问题

下面进行代码的实现

#include<iostream>
using namespace std;
//继承中的对象模型
class Base
{
public:
	int m_A;
protected:
	int m_B;
private:
	int m_C;
};
class son
{
	int m_D;
};
int main()
{
	cout << "size of son" << sizeof(son) << endl;
	return 0;
}

下面我们看一下如果没有继承的话,子类的大小为多少

 答案是四个 字节的空间

现在再加入继承 

继承中的对象模型
#include<iostream>
using namespace std;
//继承中的对象模型
class Base
{
public:
	int m_A;
protected:
	int m_B;
private:
	int m_C;
};
class son :public Base//运用公共继承
{
	int m_D;
};
int main()
{
	cout << "size of son" << sizeof(son) << endl;
	return 0;
}

此时所占大小为16个字节

是因为此时的继承会将父类的所有非静态属性全部继承下来对于里面的私有属性,确实访问不到,因为编译器给它隐藏下去了,但是它确确实实被继承下去了。

此时到这里继承的对象模型也就结束了,下面我们进行最后一项 继承中的构造函数和析构函数的顺序我们在进行继承的时候,究竟是先有了父类还是先有了子类,这时候就要运用构造和析构来进行验证

下面进行代码的验证 

#include<iostream>
using namespace std;
//继承中构造和析构的和顺序
class base1//父类
{
public:
	base1()
	{
		cout << "父类的构造函数" << endl;
	}
	~base1()
	{
		cout << "父类的析构函数" << endl;
	}
};
class son :public base1//子类(公共继承的方式)
{
public:
	son()
	{
		cout << "子类的构造函数" << endl;
	}
	~son()
	{
		cout << "子类的析构函数" << endl;
	}
};
void test1()
{
	son p;
}
int main()
{
	test1();
	return 0;
}

此时的结果为 

通过这个结果我们可以清楚的看到,在进行继承的时候是先有了父类再有了子类最后父类再消失 

到这里今天的内容也就结束了,继承这部分还在持续更新中,希望大家可以多多支持小张,小张在这里提前谢谢大家啦!

评论 80
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小张﹉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值