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

 更新时间:2021年03月22日 15:32:41   作者:爱吃甜甜圈の酱  
这篇文章主要介绍了C++中的继承模式深入详解。继承是OOP设计中的重要概念。在C++语言中,派生类继承基类有三种继承方式:私有继承(private)、保护继承(protected)和公有继承(public)。

前言

继承是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++中的继承模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言联合体的实现示例

    C语言联合体的实现示例

    C语言联合体是一种特殊的数据结构,它允许在相同的内存位置存储不同的数据类型,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11
  • 浅谈C语言中的指针和数组有什么区别

    浅谈C语言中的指针和数组有什么区别

    C语言中的指针和数组是两个重要的数据结构,它们在内存管理和数据存储方面有许多相似之处,但也存在一些关键的区别,本文就来介绍一下C语言中的指针和数组有什么区别,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • C++中std::shuffle的使用小结

    C++中std::shuffle的使用小结

    std::shuffle是C++标准库中的一个函数,用于对容器中的元素进行随机排列,本文主要介绍了C++中std::shuffle的使用小结,具有一定的参考价值,感兴趣的可以了解一下
    2025-04-04
  • C++ Qt开发之CheckBox多选框组件的用法详解

    C++ Qt开发之CheckBox多选框组件的用法详解

    Qt是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍CheckBox单行输入框组件的使用方法,需要的朋友可以参考下
    2023-12-12
  • C++中菱形继承的解释与处理详解

    C++中菱形继承的解释与处理详解

    菱形继承是多重继承中跑不掉的,Java拿掉了多重继承,辅之以接口。C++中虽然没有明确说明接口这种东西,但是只有纯虚函数的类可以看作Java中的接口,下面这篇文章主要给大家介绍了关于C++中菱形继承的解释与处理的相关资料,需要的朋友可以参考下
    2022-02-02
  • 用C++的odeint库求解微分方程

    用C++的odeint库求解微分方程

    求解微分方程的数值解一般使用MATLAB等数值计算软件,其实C++也可以求解微分方程,需要用到odeint库,它是boost库的一部分。官方教程和示例比较晦涩,本文力求用较短的篇幅介绍它的基本用法,需要的朋友可以参考下面文章的具体内容
    2021-09-09
  • 基于C++ OpenCV制作电子相册查看器

    基于C++ OpenCV制作电子相册查看器

    这篇文章主要介绍了如何使用OpenCV C++ 制作电子相册查看器。类似于win10系统的“照片”功能。感兴趣的小伙伴可以跟随小编一起学习一下
    2022-01-01
  • 详解计数排序算法及C语言程序中的实现

    详解计数排序算法及C语言程序中的实现

    技术排序算法与我们普通接触的冒泡排序和快速排序等基于元素比较的算法不同,在编程中通过C语言的数组能够清除地表达出来,这里我们就来详解计数排序算法及C语言程序中的实现
    2016-07-07
  • Qt 中 isHidden 和 isVisible 的区别与使用小结

    Qt 中 isHidden 和 isVisible 的区别与使用小结

    Qt 中的 isHidden() 和 isVisible() 方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操作组件致关重要,下面给大家介绍Qt 中 isHidden 和 isVisible 的区别与使用,感兴趣的朋友一起看看吧
    2025-03-03
  • C++实现职工信息管理系统

    C++实现职工信息管理系统

    这篇文章主要为大家详细介绍了c++实现职工信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01

最新评论