文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C++中的继承模式深入详解

2024-04-02 19:55

关注

前言

继承是OOP设计中的重要概念。在C++语言中,派生类继承基类有三种继承方式:私有继承(private)、保护继承(protected)和公有继承(public)。

一、继承规则

继承是C++中的重要特性,派生类可以访问基类中的protected和public成员
先上代码:


#include<iostream>
using namespace std;

class Base
{
	private:
			void func_pri();
	protected:
			void func_pro();
	public:
			void func_pub();
};

void Base::func_pri()
{
	cout << "private" << endl;
}
void Base::func_pro()
{
	cout << "protected" << endl;
}
void Base::func_pub()
{
	cout << "public" << endl;
	this->func_pri();
}

class Derive:public Base
{
	public:
		void function();
};

void Derive::function()
{
	//func_pri();调用private成员会产生编译错误
	func_pro();
	func_pub();
}

int main()
{
	Derive* derive;
	derive=new Derive;
	derive->function();
	//output:
	//protected public private
	delete derive;
	return 0;
}

酱在这里用一段简单地代码为大家说明了继承的规则。派生类只能访问基类的public和protected成员,无法访问private成员;若要调用类中private成员,要在类内部使用this指针传参(关于this指针的用法,酱在后续文章中会为大家进一步整理)。这里Derive是public Base,是公有继承。
上表:


友元函数一直比较有争议,有人认为它在一定程度上破坏了类的封装性。关于友元函数的学习文章酱会在后续发出。

二、继承类型

首先要确立一个概念:无论是公有、私有还是保护继承,说到底它们都属于继承,满足继承的基本规则(如上表)。无论是private、protected还是public,对于直接向基类继承的派生类来说几乎没有影响(即俗称的“子代”而非“孙子代”)。上面的代码class Derive:public Base换成private Base和protected Base,结果都是一样的。
影响的是派生类的继承,即“孙子代”。

1.保护继承

先上代码:


#include<iostream>
using namespace std;

class Base
{
	private:
			void func_pri();
	protected:
			void func_pro();
	public:
			void func_pub();
};

void Base::func_pri()
{
	cout << "private" << endl;
}
void Base::func_pro()
{
	cout << "protected" << endl;
}
void Base::func_pub()
{
	cout << "public" << endl;
	this->func_pri();
}

class Derive:protected Base
{
	public:
		void function();
};

void Derive::function()
{
	func_pro();
	func_pub();
}

class Derive_sec:public Derive
{
	public:
		void func_sec();
};

void Derive_sec::func_sec()
{
	func_pub();
	func_pro();
	//func_pri();调用这里时会产生错误
}

int main()
{
	Derive_sec* derive;
	derive=new Derive_sec;
	derive->func_sec();
	delete derive;
	return 0;
}

这段代码运行后的结果是public protected。
可以看出的是Derive_sec类(子二代)可以调用的是Base基类的protected和public成员函数,而无法调用private成员函数。

2.私有继承

先上代码:


#include<iostream>
using namespace std;

class Base
{
	private:
			void func_pri();
	protected:
			void func_pro();
	public:
			void func_pub();
};

void Base::func_pri()
{
	cout << "private" << endl;
}
void Base::func_pro()
{
	cout << "protected" << endl;
}
void Base::func_pub()
{
	cout << "public" << endl;
	this->func_pri();
}

class Derive:private Base
{
	public:
		void function();
};

void Derive::function()
{
	func_pro();
	func_pub();
}

class Derive_sec:public Derive
{
	public:
		void func_sec();
};

void Derive_sec::func_sec()
{
	//func_pub();调用时会产生错误
	//func_pro();调用时会产生错误
	//func_pri();调用这里时会产生错误
	function();
}

int main()
{
	Derive_sec* derive;
	derive=new Derive_sec;
	derive->func_sec();
	delete derive;
	return 0;
}

通过结果来看,Derive_sec类(子二代)对Base基类中private、protected和public的成员函数均不能调用,但其仍然可以调用子一代的公有函数。

总结

在三种模式的继承中,我们可以看出当子一代设置为公有继承/保护继承基类时,子二代对基类protected、public成员变量可以访问,而对private变量不可访问;当子一代设置为私有继承基类时,子二代对基类private、protected、public成员变量均不能访问.
我们可以得出这样的结论:当基类和派生类具有直接继承关系时,按照上文所述继承规则即可;若派生类是经过对基类的多重继承得来的,则要考虑之前的继承模式。
private继承模式在对类之间的封装性有要求时,可以考虑使用。

到此这篇关于C++中的继承模式深入详解的文章就介绍到这了,更多相关C++中的继承模式内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯