【C++】面向对象---继承(万字详解)

C++子类会继承父类的静态成员函数和静态成员变量和静态子对象吗 C++中,子类会继承父类的静态成员函数和静态成员变量,但不会继承父类的静态子对象。静态成员函数和静态成员变量是属于类本身的,因此子类可以直接访问和使用父类的静态成员函数和静态成员变量。静态子对象并不会被子类继承,因为静态成员对象是独立于类的实例的。每个类只有一个静态成员对象,而不是每个类的实例都有一个静态成员对象。因此,子类无法继承父类的静态子对象。如果您希望在子类中使用父类的静态成员对象的值,您可以通过访问父类的静态成员函数或静态成员变量来实现,而不是通过继承静态子对象。希望这能解答您的问题。 阅读详情


前言

继承是面向对象的一个重点,而继承和多态也息息相关。继承继承,顾名思义,就是继承父亲的所有。现实中有继承,那么C++里面也有继承。所以说,程序实际上就是对现实世界的抽象。废话不多说,接下来步入正题。


一、继承的定义及概念

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保
持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象
程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继
承是类设计层次的复用。

那么继承如何定义呢? 很简单,继承的定义格式class 类名 : 继承方式(public/protected/private) 基类类名。
代码演示:
首先我们需要有一个基类,我暂且把基类的成员设置为公有。

class Person
{
public:
	string _name;
};

其次我们需要一个派生类,来继承基类。我们的基类是Person,那我们再定义一个Student类,来继承Person。

Student定义:

class Student : public Person
{
public:
	int _num;
};

这样,Student类和Person类就完成了继承关系。Student 就是Person的子类。但这也不意味着子类就可以使用父类的成员了。因为C++中的继承方式有9种。


二、继承方式

C++中的继承方式有以下9种。

类成员/继承方式public方式继承protected方式继承private方式继承
基类的public成员在派生类中是public在派生类中是protected在派生类中是private
基类的protected成员在派生类中是protected在派生类中是protected在派生类中是private
基类的private成员在派生类种不可见在派生类种不可见在派生类种不可见

也就是说,用public继承的话,基类的成员会原封不动的继承到派生类。所以我们上面用public继承,那么基类的public成员继承到派生类还是public成员。所以我们可以直接使用父类对象的public成员。

在这里插入图片描述


三、基类和派生类之间的转换

那么我们把子类(派生类) 赋值给 父类(基类),可以吗?
我们用下面这个代码来试试。

void test2()
{
	Person p;
	Student s;
	s._name = "李四";
	s._num = 2;
	p = s;
	cout << p._name << endl;
}

测试结果 :
在这里插入图片描述
子类对象是可以给父类的。那么父类对象可以给子类吗?

在这里插入图片描述
答案是不行,但是如果你真的想转,也是可以的。

//父类传给子类
void test3()
{
	Person p;
	Student s;
	Person* pp = &p;
	Student* ps = (Student*)pp;
	ps->_name = "张三";
	cout << ps->_name << endl;
}

但是这有很大的风险,那就是内存越界!因为基类没有派生类的成员。而用派生类的指针去强制指向父类,那么当派生类去访问自己的成员的时候,就会导致内存越界。
在这里插入图片描述

为什么会这样呢?那是因为在转换的过程会进行切片操作。


四、切片

当基类和派生类对象进行转换时,会发生切片操作。

基类有一个成员的_name,而派生类Student继承了Person。所以Student有个隐藏的成员_name。
在这里插入图片描述
当把Student 赋值给 Person时,会发生切片操作。
在这里插入图片描述

简单理解就是把 Person 给 Student的成员 赋值给了 Person,而Student自己的成员_num则不会赋过去。

为什么Person 不能赋值给Student? 因为Person没有足够的成员给Student,Student自己的成员_num无法被给予。
在这里插入图片描述

为什么指针强制转换就可以呢?
因为pp一开始指向Person
在这里插入图片描述

而Person 的空间范围是
在这里插入图片描述

此时把它强制转换成 Student指针的话,那么它的范围会变成这样。
在这里插入图片描述
这就造成了越界访问,所以这是非常危险的操作。


五、继承中的作用域

如果2个类中,有相同的成员名,那么父类的成员会被隐藏。优先使用子类的成员,简单说就是就近原则。

代码演示:

class Person
{
public:
	void f() 
	{
		cout << "Person" << endl;
	}

	string _name;
};

class Student : public Person
{
public:
	void f() //和父类有相同的函数成员
	{
		cout << "Student" << endl;
	}
	int _num;
};

void test4()
{
	Student s;
	s.f();
}

运行结果:
在这里插入图片描述
我们会发现它只调用了自己的成员,如果想调用父类的成员,那么需要::域限定符才能调用父类成员。

void test4()
{
	Student s;
	s.Person::f();
}

这样,我们就调用了父类的成员函数
在这里插入图片描述


六、派生类中的默认成员函数

6个默认成员函数,“默认”的意思就是指我们不写,编译器会变我们自动生成一个,那么在派生类中,这几个成员函数是如何生成的呢?

1 . 派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。如果基类没有默认 的构造函数,则必须在派生类构造函数的初始化列表阶段显示调用。

2 . 派生类的拷贝构造函数必须调用基类的拷贝构造完成基类的拷贝初始化。

3 . 派生类的operator=必须要调用基类的operator=完成基类的复制。

4 . 派生类的析构函数会在被调用完成后自动调用基类的析构函数清理基类成员。因为这样才能保证派生类对象先清理派生类成员再清理基类成员的顺序。

5 . 派生类对象初始化先调用基类构造再调派生类构造。

6 . 派生类对象析构清理先调用派生类析构再调基类的析构。

7 . 因为后续一些场景析构函数需要构成重写,重写的条件之一是函数名相同(这个我们后面会讲解)。那么编译器会对析构函数名进行特殊处理,处理成destrutor(),所以父类析构函数不加virtual的情况下,子类析构函数和父类析构函数构成隐藏关系。

接下来我们来测试一下

class Person
{
public:
	Person()
	{
		cout << "Person" << endl;
	}

	Person(const Person& p)
	{
		if (&p != this)
		{
			_name = p._name;
		}
		cout << "&Person" << endl;
	}

	~Person()
	{
		cout << "~Person" << endl;
	}

	string _name;
};

class Student : public Person
{
public:
	Student()
	{
		cout << "Student" << endl;
	}
	~Student()
	{
		cout << "~Student" << endl;
	}
	int _num;
};

void test1()
{
	Student s;
}

int main()
{
	test1();

}

我们可以发现,它先调用了基类的构造函数,再调用派生类的构造函数。随后派生类先调用析构函数,基类再调用析构函数。
在这里插入图片描述

同样的,派生类再调用拷贝构造函数前,必须显示调用基类的拷贝构造函数。

class Student : public Person
{
public:
	Student()
	{
		cout << "Student" << endl;
	}

	Student(const Student& p)
		:Person(p) //先调用基类的拷贝构造
	{
		if (&p != this)
		{
			_num = p._num;
		}
		cout << "&Student" << endl;
	}

	~Student()
	{
		cout << "~Student" << endl;
	}
	int _num;
};

在这里插入图片描述

而重写派生类 赋值操作符时,也必须先调用基类的 赋值操作符重写。

//基类的 =重写函数
	Person& operator=(const Person& p)
	{
		_name = p._name;
	}

//派生类的=重写函数
	Student& operator=(const Student& p)
	{
		Person::operator=(p); //调用基类的 =赋值重载
		_num = p._num;
	}

那么派生类的析构函数是否也要先调用基类的构造函数呢? 答案是不用!因为栈是一个后进先出的结构。基类先调用构造函数,那么基类就必须后析构。 这样才符合栈先进后出的性质,如果在析构函数里面调用了基类的析构函数,那么基类就会析构俩次。此时如果基类有动态申请的空间。那么程序就会报错,因为一块空间被释放了2次。


七、继承中的友元与静态成员

继承与友元

父类的友元不会继承给子类。通俗来讲,就是你父亲的朋友你不一定认识。如果要父类的友元也是子类的友元,那么需要子类自己去friend一下。

继承中的静态成员

静态成员会被继承,但是不会给它新开空间。通俗的说,子类父类共用同一个静态成员。

我们给父类加一个静态成员 _count,每次调用构造函数就++一次。

class Person
{
public:
	Person()
	{
		++_count;
		cout << "Person" << endl;
	}

	Person(const Person& p)
	{
		if (&p != this)
		{
			_name = p._name;
		}
		cout << "&Person" << endl;
	}

	Person& operator=(const Person& p)
	{
		_name = p._name;
	}

	~Person()
	{
		cout << "~Person" << endl;
	}
	static int _count;
	string _name;
};
	int Person::_count = 0;

然后我们打印一下子类父类的count值以及count的地址

void test3()
{
	Person p;
	Student s;
	cout << p._count << ":" << &p._count << endl;
	cout << s._count << ":" << &s._count << endl;
}

在这里插入图片描述
这里我们可以看出,子类会继承父类的 静态成员,并且与父类共用一个静态成员。


八、棱形继承和虚继承

棱形继承

C++是支持多继承的,而多继承就会面临一个问题,那就是菱形继承。什么是菱形继承呢? 看一下这张图就知道了。

在这里插入图片描述

如图,assistant是助手类,它既可以继承Teacher,也可以继承Student。而Student 和 Teacher 都继承 Person。而这就形成了一个菱形继承,而菱形继承具有很大的冗余性和二义性。

那么我们也这段代码来测测它的冗余性。

class Person
{
public:
	Person()
	{
		cout << "Person" << endl;
	}

	Person(const Person& p)
	{
		if (&p != this)
		{
			_name = p._name;
		}
		cout << "&Person" << endl;
	}

	Person& operator=(const Person& p)
	{
		_name = p._name;
	}

	~Person()
	{
		cout << "~Person" << endl;
	}
	string _name;
};

class Student : public Person
{
public:
	Student()
	{
		cout << "Student" << endl;
	}

	Student(const Student& p)
		:Person(p) //先调用基类的拷贝构造
	{
		if (&p != this)
		{
			_num = p._num;
		}
		cout << "&Student" << endl;
	}

	Student& operator=(const Student& p)
	{
		Person::operator=(p); //调用基类的 =赋值重载
		_num = p._num;
	}

	~Student()
	{
		cout << "~Student" << endl;
	}
	int _num;
};

class Teacher : public Person
{
public:
	Teacher()
	{
		cout << "Teacher" << endl;
	}

	Teacher(const Teacher& p)
		:Person(p) //先调用基类的拷贝构造
	{
		if (&p != this)
		{
			_num = p._num;
		}
		cout << "&Teacher" << endl;
	}

	Teacher& operator=(const Teacher& p)
	{
		Person::operator=(p); //调用基类的 =赋值重载
		_num = p._num;
	}

	~Teacher()
	{
		cout << "~Teacher" << endl;
	}
	int _num;
};

class Assistant : public Teacher,public Student
{
public:
	Assistant()
	{
		cout << "Assistant" << endl;
	}

	~Assistant()
	{
		cout << "~Assistant" << endl;
	}
	int _num;
};

void test4()
{
	Assistant a;
}

int main()
{
	test4();
}

我们发现,创建一个对象,Person被调用了2次。如果Person上面有大型数组,那么就会造成数据冗余。
在这里插入图片描述
再调用Assistant类的构造函数之前,必须先调用其父类的构造函数。而其继承顺序是先继承Teacher,所以它会先调用Teacher的构造函数。但又因为Teacher又继承了Person,所以Person的构造函数要在Teacher之前调用。所以调用顺序就是 Person->Teacher->Person->Student->Assistant 。析构顺序则是反过来。


而棱形继承不仅有冗余性,还有二义性。我们用Assistant对象调用一下_name成员。

在这里插入图片描述
我们会发现它提示,_name不明确。那是因为不知道用Teacher的_name还是用Student的_name。所以会出现这种情况。要解决这个问题也很简单,加上域限定符指定即可。
在这里插入图片描述

即便解决了二义性的问题,但依然存在冗余的情况,所以这种情况我们可以用虚继承。

虚继承

虚继承是在"腰"上进行的,也就是在 :后面加上virtual
在这里插入图片描述
Teacher类虚继承Person
在这里插入图片描述
Student类虚继承Person
在这里插入图片描述
然后我们再运行看看
在这里插入图片描述
我们可以看到,二义性解决了,冗余性也得到了改善。Person只会被构造一次。可能看似没什么,但如果我Person 有一个成员变量是 1个大小为100000的数组呢? 那么构造2次就会产生2个这样的数组,这样就造成了严重的空间浪费。


那么虚继承在内存中是怎么操作的呢? 首先,我们先写个棱形继承。

在这里插入图片描述


class A
{
public:
	int _a;
};

class B : virtual public A
{
public:
		int _b;
};

class C : virtual public A
{
public:
	int _c;
};

class D :  public B,  public C
{
public:
	int _d;
};

int main()
{
	D d;
	d.B::_a = 1;
	d.C::_a = 2;
	d._b = 3;
	d._c = 4;
	d._d = 5;
	d._a = 0;
	return 0;
}

然后我们调试,打开内存监测窗口。
在这里插入图片描述
然后一步一步调试观察
在这里插入图片描述
最后的结果是这样的
在这里插入图片描述
在这里插入图片描述
我们发现 B和C的公共成员都存放在最后一行。
那么B和C上面的地址是什么呢?我们在内存观测一下
48 7b 00 01 ,小端存储的话就是倒过来的,实际地址是 01 00 7b 48
在这里插入图片描述

54 7b 00 01 ,小端存储就是 01 00 7b 54
在这里插入图片描述
我们发现第二行全是0,这是给其他东西预留的,我们可以不用管。我们只看第二行。而14是16进制的值,转换为10进制就是20,0c转换成十进制就是12。
在这里插入图片描述
这样我们就可以得出,第二行存放的是到公共成员的偏移量/相对距离。而偏移量就是地址处到公共成员的距离。
在这里插入图片描述
也就是说,在D里面,A放在了一个公共的位置,不属于B也不属于C。而B和C要去找A的时候。会通过 地址处(虚基表) 保存的偏移量,来找到A。

总结

在java或者其他的一些语言中,是没有多继承的,只有单继承。因为多继承可能是一个缺陷,也很少用到。但这也正是C++的特点,而和继承息息相关的还有多态,多态的难度还要大于继承。所以后面会为大家写一篇关于多态的文章。如果文中有讲的不好的,或者错误的地方。欢迎各位指出。

基于Ansys Fluent 的颗粒分离/过滤解决方案 过滤是指通过特殊装置将颗粒移除,将流体提纯净化的过程。过滤的方式很多,应用的物系也很广泛,固-液、固-气、大颗粒-小颗粒等。 阅读详情

相关推荐

使用 Restart Extension 继续解决 Ansys 机械分析

您正在执行复杂或大型的多步有限元分析,突然,您意识到经过数小时的求解后,您需要添加或修改边界条件。在本篇博文中,您将了解如何利用 Ansys Mechanical 中的 RestartAnalysis 扩展来扩展多步分析,方法是合并额外的时间步骤和边界条件,而不会丢失已计算的结果。幸运的是,在 Mechanical 中,有一种直接的方法可以实现这一点,而不会损害您之前的结果,而这在添加新边界条件和使用重新启动点时经常发生。得到的结果符合预期,您可以看到施加的力产生的这两个部分之间的相对位移。

jkh920184196的博客 1232

C++继承

继承:是一个类从另一个类获取成员变量和成员函数的过程(子类继承于父类)派生:一个类派生给一个类(父类派生给子类)继承的格式:class 子类名 : 继承方式 父类名{ 内容 };单继承: 继承的方式: 继承的方式有三种:public protected private 保护继承: 私有继承: 继承中同名成员的处理: 成员变量同名: 举一个混合的例子:

qq_45303986的博客 2057

Zemax实战录——非序列模式下的微透镜阵列仿真与优化

本文详细介绍了在Zemax非序列模式下进行微透镜阵列仿真的完整流程与优化技巧。文章重点阐述了从序列模式切换到非序列模式的必要性,并逐步指导如何搭建光源、阵列与探测器的仿真环境。核心在于通过调整圆锥系数等关键参数优化像差,并增加光线数以提升仿真精度与均匀性,为光学设计提供可靠依据。

weixin_28339967的博客 524

【007 类和数据的抽象】C++ 类中静态成员和静态成员函数是怎样继承的?

如果也可以调用,

kashine的博客 1241

华为2022硬件逻辑笔试题

单选题(每题两分) 1.以下关于过程赋值的描述,不正确的是() A在非阻塞性过程赋值中,使用赋值符号“< =” B赋值操作符是“=”的过程赋值是阻塞性过程赋值 C在非阻塞性过程赋值中,对目标的赋值是非阻塞的(因为时延),但可预定在将来某个时间步发生(根据时延:如果是0时延,那么在当前时间步结束) D非阻塞性过程赋值在其后所有语句执行前执行 解:D 2.芯片的功耗和下列哪种不强相关_____________。 A资源利用率 B核电压 C组合逻辑级数 D翻转率 解:A 3.下列说

weixin_44072819的博客 1万+

AGV路径规划实战:如何用Python+ROS实现激光SLAM导航(附避障代码)

本文提供了一份基于Python和ROS实现AGV激光SLAM导航的实战指南。内容涵盖从Docker环境搭建、激光雷达数据处理、Gmapping建图,到Move_Base全局/局部路径规划与TEB局部规划器配置的全流程。重点解析了如何通过参数调优实现稳定导航,并附带了紧急避障代码,帮助开发者快速构建具备自主路径规划与实时避障能力的AGV系统。

pepsi的博客 1235

C++中的继承

一.继承的概念及定义 发现问题:当我们编写一个类时,发现这个类与类外一个类的成员变量和成员方法相似,并且具有一定的包含关系时,我们编写的这两个类会有很多相似的地方。 比如: 1.1 继承的概念 继承机制是面向对象程序设计使代码可以复用的重要手段。它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生的类称为派生类。 继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承使类设计层次的复用。 ...

weixin_57023347的博客 6414

十一、学生信息管理系统(PyQt5+MySQL+PyMySQL模块实现)

学生信息管理系统(PyQt5+MySQL+PyMySQL模块实现)

ungoing的博客 8991

【C++】继承 ⑩ ( 继承机制中的 static 静态成员 | 子类中访问父类静态成员的方法 )

一、继承机制中派生类中的 static 关键字 1、子类继承父类静态成员 2、父类静态成员访问控制权限的改变 3、子类如何访问父类静态成员 4、静态成员使用要点 二、完整代码示例

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 3720

RK3568平台YOLO11模型部署实战:从环境搭建、模型转换到板端性能优化全解析

摘要: 本文详细介绍了在RK3568平台上从零部署YOLO11模型的完整流程。主要内容包括:1) 基于Conda搭建Python 3.8开发环境并安装RKNN-Toolkit2工具链;2) 使用LabelImg工具标注数据并构建YOLO格式数据集;3) 基于Ultralytics框架进行YOLO11模型训练及参数优化;4) 实现PyTorch→ONNX→RKNN的完整模型转换链。文章特别针对RK3568平台的NPU特性提供了关键参数配置建议,并分享了实际开发中的经验总结,最终可达到30FPS的稳定推理性能。

LXY_LOVE36的博客 280

python全栈入门到实战【基础篇 02】环境搭建:Python解释器与PyCharm、VSCode编辑器安装配置详解

本文详解Python环境搭建步骤。首先安装解释器(运行代码核心),需从官网下载,选3.8及以上版本(勿选2.x)。Windows安装必勾“Add Python.exe to PATH”,验证用`python --version`;Mac选universal2安装包,验证用`python3 --version`。 编辑器二选一:PyCharm社区版(免费,新手推荐),安装后需配置解释器路径;VSCode轻量,需装Python插件并选择解释器。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 5万+

C++之继承详解(万字讲解)

C++继承详解,继承概念与定义,六大默认函数,基类和派生类赋值转换,继承中的作用域,继承与友元,继承与静态成员,菱形虚拟继承,菱形继承,菱形继承的深度剖析

be_a_struggler的博客 1万+

使用YubiKey进行全盘加密、加密启动分区以及利用UEFI安全启动的详细指南

在本教程中,我们将使用YubiKey来增强电脑的安全性,通过加密整个硬盘,确保只有持有正确YubiKey的人才能访问。UEFI安全启动是一种在UEFI固件级别实施的安全标准,确保计算机仅启动签名的启动加载程序。为了符合您的要求,我将以此方式分配内容,确保每部分都有详尽的说明和代码。现在,您已经成功地使用YubiKey设置了全盘加密,并使用UEFI安全启动为系统增加了额外的安全层。注意:为了简洁和清晰,本文中的代码可能不是最优的或最完整的实现。注意:为了简洁和清晰,本文中的代码可能不是最优的或最完整的实现。

qq_38334677的博客 1006

c++继承(万字详解、有图更直观易懂)

由于这块内容比较重要,知识点较多,所以在一些地方比较啰嗦,请大家见谅!继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。例如。

2301_80774875的博客 4168

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C++之继承(万字详解)

本文介绍了C++继承的基本概念和使用方法。首先通过学生和教师类代码冗余问题引入继承主题,指出继承可以实现代码复用。继承允许派生类在基类基础上扩展新成员,形成层次结构。文章详细讲解了三种继承方式(public、protected、private)对访问权限的影响,强调public继承是最常用的方式。此外,还分析了基类和派生类之间的赋值转换规则(派生类可赋值给基类,反之不行)以及继承中的隐藏规则(同名成员会隐藏基类成员)。最后通过代码示例演示了继承的实际应用,包括类模板的继承实现。

2401_84420653的博客 1251

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【C++】面向对象---多态(万字详解)

C++多态详解,让你深入理解多态

Lin5200000的博客 2811

C++从入门到起飞之——继承下篇(万字详解) 全方位剖析!

所以,我们一定要记住,无论在什么情况下,我们都不要显示调用父类的析构函数,多次析构可能会引起程序的崩溃!5. 派⽣类对象初始化。

2301_80221228的博客 1753

【C++】继承(万字详细总结)

继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用int _age;// ...// 学号int _age;

金哥的博客 955

【C++】继承(万字详解) —— 切片 | 隐藏 | 子类的默认成员函数 | 菱形继承

但行好事,莫问前程

qq_42996461的博客 2167

c++继承(万字详解)画图+原理解说

继承的定义 继承关系和访问限定符 从这里可以看出,共有3*3 = 9种组合方式。那么,这些方式有什么区别呢? 类成员/继承方式 public 继承 protected继承 private继承 基类的public成员 派生类的public成员 派生类的protected成员 派生类的private成员 基类的protected成员 派生类的protected成员 派生类的protected成员 派生类的private成员 基类的private成员 派生类中不可见 派生类中不可

gaogo 1027

C++之继承(万字详解)

public:{}{}protected:string _name = "张三";通过上面代码我们可以看到没有继承之前我们设计了两个类Student和Teacher,Student和Teacher都有姓名/地址/电话/年龄等成员变量,都有identity⾝份认证的成员函数,设计到两个类⾥⾯就是冗余的。

2302_80964245的博客 679

【C++】万字一文全解【继承】及其特性__[剖析底层化繁为简](20)

全文包括1.继承复用组合的区别2.继承的基本格式与继承以后的访问方式变化(基类成员),其中重点包括其访问方式的变化——基类成员经过不同继承以后分别到派生类中的什么作用域中。基类和派生类对象的复制转换(切片)3.继承中的隐藏4.派生类的默认成员函数生成机制5.派生类的默认成员函数生成机制6.友元关系不能被继承7.基类定义了static静态成员,整个继承体系里面只有这样一个成员8.复杂的菱形继承以及菱形虚拟继承

YYDsis的博客 2535

C++之继承(万字长文详解)

C++之继承详解

m0_74376760的博客 775

【C++】继承(万字详解,2024年我们程序员该如何进阶和规划

常见的大多是。

2301_79099378的博客 1211

C++入门基础(万字详解!!!)

C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行面向对象的程序设计。

忘忧. 5万+

C++入门基础(万字详解)建议收藏!!!

C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。因此:C++是基于C语言而产生的,

Miun123的博客 5733

C++---面向对象三大特性(万字长文)

继承是面向对象编程的一个核心机制,它允许我们创建一个新类(派生类 / 子类,Derived / Child Class),这个新类可以获取一个已存在类(基类 / 父类,Base / Parent Class)的属性和方法。这种关系通常被称为 “is-a” (是一种) 关系。例如,Car(小汽车)is-aVehicle(交通工具)。通过模板函数重载运算符重载CRTP(奇异递归模板模式)等技术,让同一个接口在编译期选择不同实现,无需运行时分派,零虚表开销。

会分享一些自己学习过程中的笔记,欢迎一起交流讨论 6031
上一篇: 【C++】STL---list的模拟实现
下一篇: 【C++】面向对象---多态(万字详解)
林   子
博客等级 码龄4年 2671粉丝 64原创
评论 108
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

林 子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值