C++继承

众所周知,C++有几大特性:抽象,封装,继承,多态,最近刚刚复习到了继承(inheritance),做一个小总结。

首先为什么要有继承?继承又是用来干什么的?根据百度百科所写,继承机制,就是利用已有的数据类型来定义新的数据类型。所定义的新的数据类型不仅拥有新定义的成员,而且还同时拥有旧的成员。我们称已存在的用来派生新类的类为基类,又称为父类。由已存在的类派生出的新类称为派生类,又称为子类。

上面一段话说简单点其实就是为了少写些代码,避免重复性的代码,打个通俗的比方,我们现在用的iphone6/6s,其实就是源自于最早的手机,比如最早的手机只有打电话,发短信的功能模块,而我们的iphone系列就是一步步继承下来,在原先的基础上增加了上网,看视频,打游戏等等模块,我们并不需要重新发明打电话,发短信的模块,只需要拿过来用或者略加修改的拿过来用,从来减轻我们的负担,在原先的基础上继续加新功能这也就是继承。因此继承可以增强代码的复用性,在保持原有类特性的基础上进行扩展,增加功能,它体现了面向对象程序设计的层次结构,由简单到复杂的认知过程。同时它也是多态性的前提,使用继承的同时也提高了类的耦合度。

继承关系和访问限定符

结合下面一张图就可以对继承有个清晰明了的认识:

具体见如下代码:

class Base
{
public:
	void ShowBase()
	{
		cout << "_pri = " << _pri << endl;
		cout << "_pro = " << _pro << endl;
		cout << "_pub = " << _pub << endl;
	}
private:
	int _pri;
protected:
	int _pro;
public:
	int _pub;
};

class Derived1 : public Base//公有继承
{
public:
	void ShowDerived1()
	{
		//cout << "_pri = " << _pri << endl;私有成员在子类中不可见
		cout << "_pro = " << _pro << endl;
		cout << "_pub = " << _pub << endl;
	}
};

class Derived2 : protected Base//保护继承
{
public:
	void ShowDerived2()
	{
		//cout << "_pri = " << _pri << endl;私有成员在子类中不可见
		cout << "_pro = " << _pro << endl;
		cout << "_pub = " << _pub << endl;
	}
};

class Derived3 : private Base//私有继承
{
public:
	void ShowDerived3()
	{
		//cout << "_pri = " << _pri << endl;私有成员在子类中不可见
		cout << "_pro = " << _pro << endl;
		cout << "_pub = " << _pub << endl;
	}
};

void FunTest()
{
	Derived1 d1;//公有继承类
	Derived2 d2;//保护继承类
	Derived3 d3;//私有继承类
	d1._pub = 1; //在基类中是public,且是公有继承,所以可以在子类和类外都可访问
	//d1._pro  在基类中是protected,因此在公有继承类中访问,在类外不行


	//d2._pub 保护继承,在子类中变为protected,只可以在类中访问,不可在类外访问
	//d2._pro 保护继承,在子类中变为protected,只可以在类中访问,不可在类外访问

	//d3._pub 私有继承,在子类中变为private,只可以在类中访问,不可在类外访问
	//d3._pro 私有继承,在子类中变为private,只可以在类中访问,不可在类外访问
}
由上可以总结出:

1.基类的private成员在派生类中是不能被访问的,如果基类成员不想在类外直接被访问,但需要在派生类中能访问,就定义为protected。因此可以看出保护成员限定符是因继承才出现的。

2.不管是哪种继承方式,子类内部都可以访问父类的public成员和protected成员,子类的private成员存
在但是在子类中不可见(不能访问)。
3. 使用关键字class时默认的继承方式是private,使用struct时默认的继承方式是public,不过最
好显示的写出继承方式。
4. 在实际运用中一般使用都是public继承,极少场景下才会使用protetced/private继承.

-------------------------------------------------------------------------------------------------------------------上面讲了继承关系以及三种继承的成员限定符,实际上在使用继承还需要了解继承体系中构造函数和析构函数调用过程:




我们通过下面一段代码理解:

class A
{
public:
	A()
	{
		cout << "A()" << endl;
	}
	~A()
	{
		cout << "~A()" << endl;
	}
private:
	int _a;
};

class B : public A
{
public:
	B()
	{
		cout << "B()" << endl;
	}
	~B()
	{
		cout << "~B()" << endl;
	}

private:
	int _b;
};

void FunTest()
{
	B b;
}

int main()
{
	FunTest();
	getchar();
	return 0;
}
代码最后执行的结果为:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值