C++笔记(二)--- 继承和组合

目录

C++三种继承方式

构造函数

析构

继承

public继承

protected继承

private继承

组合

访问权限

构造/析构函数调用顺序

初始化

总结


C++三种继承方式

C++有三种继承方式:public   protected   private

属性方式为

class  [派生类名称] : [继承方式]  [继承类名称]

{

//继承类中做相应动作

};

构造函数

1.子类继承父类时,如果父类没有定义构造函数,则编译器会后台添加无参构造函数,且子类默认使用父类的无参构造函数,此时子类构造函数可以任意书写

2.子类继承父类,父类仅有一个无参构造函数,则子类默认使用父类无参构造函数,且此时子类构造函数可以任意书写

class A
{
public:
//  A(){}    //写与不写,对子类继承时构造函数书写无影响。//写无参构造函数目的是实现一些初始化等工作,如果没有则可以不写int m;
};class B : public A
{
public:
//    B(int a){n = a;}//默认继承基类的无参构造函数//如果不写构造函数,则后台对B类生成一个无参构造函数,且继承基类A的无参构造函数int n;
}

3.子类继承父类,父类有有参构造函数,则子类必须显示指定继承方式且对父类构造函数初始化

class A
{
public:A(int m){ n = m;}//因写了构造函数,编译器不在生成默认的无参构造函数int n;
}class B : public A
{
public:
//  B(int i) { j = i; }    //报错,提示 “A” 没有合适的默认构造函数可用B(int i):A(i){ j = i; }    //子类的构造函数必须显式调用父类的有参构造函数int j;
};

析构

先构造的后析构,后构造的先析构

继承

基类A,后续以此基类进行讨论继承关系。

class A
{
public:A(int t){ j = t; cout << "基类A" << endl;};void pubA(){ k = 0;}//正确,private只能本类成员函数访问int i;
protected:void proA(){cout << "基类proA! " << endl;};int j;
private:void priA();int k;
};

public继承

派生类继承的基类中的 public  和  protected成员变量仍旧是 public  和  protected,派生类不能访问基类的private成员变量,派生类定义的变量不能访问基类的protected成员(其实就是protected成员函数只能在本类和其子类访问,而不能在其类实例访问一样)

class B : public A
{
public:B(){cout << "派生类B!" << endl;i = 0;//正确j = 0;//正确k = 0;//错误,无法访问基类的private成员}void pubB();int iB;
protected:void proB();int jB;
private:void priB();int kB;
};int main()
{B b;b.pubA();    //正确,继承之后为public
//    b.proA();    //报错,无法访问protected成员(在"A"类中声明)
}

protected继承

派生类继承的基类 public 和 protected 成员变量后变为自己  protected,即基类的成员变量只能在派生类的成员函数中访问,而不能在实例中访问。派生类不能访问基类的private成员变量

class B : protected A
{
public:void pubB(){cout << "派生类pubB;" << endl;}int iB;
protected:void proB(){ cout << "派生类proB;" << endl;  proA(); }//正确
//    void proB_priA() { iB = k; }    //错误,不能访问基类的private成员变量或函数
};int main(void)
{B b;
//    b.pubA();    //报错,A::pubA不可访问,因为“B”使用“protected”从“A”继承b.proB();    //正确,打印  派生类proB; 基类proA! 
}

private继承

派生类继承的基类 public 和 protected 成员变量后变为自己的 private 成员变量,但派生类仍不能访问基类的 private 成员变量和函数,虽然是以 private 继承的

class B : private A
{
public:void pubB(void){ pubA(); proA(); }    //正确,相当于访问自己类的private成员函数void pubB_priA(void){ priA(); }     //错误,不能访问基类的private成员函数
};

组合

组合其实就是一个类调用另外一个类,并对其进行实例化

访问权限

组合只能访问调用类的public

class A
{
public:A(){ cout << "基类A!" << endl;}void pubA(void){ cout << "pubA~~~" << endl; }
protected:void proA(void) { cout << "proA~~~" << endl; }
private:void priA(void) { cout << "priA~~~" << endl; }
}class B
{
public:B() { cout << "继承类B!" << endl; }void pubB(void) { a.pubA(); cout << "pubB~~~" << endl; }//正确,可以访问public成员函数
protected:void proB(void) { a.proA(); cout << "proB~~~" << endl; }//错误,不能访问A类的public以外的成员变量和函数。报错信息:“A::proA”: 无法访问 protected 成员(在“A”类中声明)
private:A a;
};

构造/析构函数调用顺序

组合调用构造函数的顺序是:先依次调用内嵌类的构造函数(依次是按定义顺序,而非赋值顺序),在调用本类的构造函数。输出时正好以相反的顺序调用析构函数

class A
{
public:A() { cout << "A" << endl; }~A() { cout << "~A" << endl; }
};class B
{
public:B() { cout << "B" << endl; }~B() { cout << "~B" << endl; }
};class C
{
public:C() { cout << "C" << endl; }~C() { cout << "~C" << endl; }
private:A a;B b;
};int main(void)
{C c;return 0;
}

输出

初始化

当调用内嵌类的含参构造函数时,需对其初始化。初始化必须在构造函数的初始化列表中完成

string s = "Hello";
class A
{
public:A(int a) { iA = a; }A(string s) { iS = s; cout << "A:iS : " << iS << endl;}
private:int iA;string iS;
};class C
{
public:C(int b) : a(b) { iB = b; }    //a(b)进行类实例初始化C(string s) : a(::s) { iS = s; cout << "C:cS :" << iS << endl;}    //::s 表示使用全局变量s
private:int iB;string iS;A a;
};int main(void)
{C c("World!");return 0;
}

输出

总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2812521.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式驱动学习第一周——git的使用

前言 本文主要介绍git的使用&#xff0c;包括介绍git&#xff0c;gitee&#xff0c;以及使用gitee创建仓库并托管代码 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程&#xff0c;未来预计四个月将高强度更新本专栏&#xff0c;喜欢的可以关注本博主并订阅本专栏&#xf…

StarRocks实战——多维分析场景与落地实践

目录 一、OLAP 系统历史背景 1.1 历史背景与痛点 1.2 组件诉求 二、StarRocks 的特点和优势 2.1 极致的查询性能 2.2 丰富的导入方式 2.3 StarRocks 的优势特点 三、多维分析的运用场景 3.1 实时计算场景 / 家长监控中心 3.2 实时更新模型选择 3.2.1 更新模型UNIQU…

一般情况下,硬件中使用Repeating Sequence出现波形很奇怪就是数据的周期频率和mcu运行的频率不一致导致的

一般情况下&#xff0c;出现波形很奇怪就是数据的周期频率和mcu运行的频率不一致导致的 把timer values 修改为0 1就好了&#xff0c;如果是0&#xff0c;0.1就不行&#xff0c;不会有下面的波形

15:00面试,15:06就出来了,问的问题过于变态了。。。

我从一家小公司转投到另一家公司&#xff0c;期待着新的工作环境和机会。然而&#xff0c;新公司的加班文化让我有些始料未及。虽然薪资相对较高&#xff0c;但长时间的工作和缺乏休息使我身心俱疲。 就在我逐渐适应这种高强度的工作节奏时&#xff0c;公司突然宣布了一则令人…

新加坡大带宽服务器概览

随着全球互联网的迅猛发展&#xff0c;服务器作为支撑网络应用的重要基础设施&#xff0c;扮演着越来越重要的角色。新加坡&#xff0c;作为亚洲四小龙之一&#xff0c;其服务器市场也备受关注。特别是新加坡的大带宽服务器&#xff0c;更是受到了众多企业和个人的青睐。那么&a…

Python 实现Excel自动化办公(上)

在Python 中你要针对某个对象进行操作&#xff0c;是需要安装与其对应的第三方库的&#xff0c;这里对于Excel 也不例外&#xff0c;它也有对应的第三方库&#xff0c;即xlrd 库。 什么是xlrd库 Python 操作Excel 主要用到xlrd和xlwt这两个库&#xff0c;即xlrd是读Excel &am…

水印相机小程序源码

水印相机前端源码&#xff0c;本程序无需后端&#xff0c;前端直接导入即可&#xff0c;没有添加流量主功能&#xff0c;大家开通后自行添加 源码搜索&#xff1a;源码软件库 注意小程序后台的隐私权限设置&#xff0c;前端需要授权才可使用 真实时间地址拍照记录&#xff0c…

无铅/低ESR 32.768 kHz晶体单元 FC3215AN

概述 FC3215AN是一款低ESR和紧凑的32.768 kHz晶体单元&#xff0c;具有坚固的无铅金属盖接缝密封封装。它配备了基于我们几十年来音叉晶体器件的内部设计和生产技术专业知识而重新设计的晶体元件。它非常适合需要低电流消耗的应用&#xff0c;例如电池供电的物联网设备。它还支…

Python分支和循环结构及其应用(文末送书)

一、分支结构 应用场景 我们写的Python代码都是一条一条语句顺序执行&#xff0c;这种代码结构通常称之为顺序结构。然而仅有顺序结构并不能解决所有的问题。 if语句的使用 在Python中&#xff0c;要构造分支结构可以使用if、elif和else关键字。所谓关键字就是有特殊含义的…

[算法沉淀记录] 排序算法 —— 选择排序

排序算法 —— 选择排序 基本概念 选择排序是一种简单的排序算法&#xff0c;它的工作原理是每次从待排序的列表中选择最小&#xff08;或最大&#xff09;的元素&#xff0c;将其与列表中的第一个位置交换&#xff0c;然后继续对剩余的元素进行排序&#xff0c;直到整个列表…

Vue3 toRaw 与 markRaw

1、toRaw 作用&#xff1a;返回将reactive&#xff0c;readonly&#xff0c; shallowReactive 或者 shallowReadonly 这个四个方法包裹的原始数据。如下图 toRaw返回的数据与包裹之前的数据一个地址值数据&#xff0c;也就是两个数据是相等。 注意&#xff1a;toRaw不能乱用…

在Ubuntu上为ARM 8处理器安装Python 3.10.4虚拟环境指南

在Ubuntu上为ARM 8处理器安装Python 3.10.4虚拟环境指南 安装Anaconda或Miniconda&#xff1a; 首先&#xff0c;您需要从官方网站下载适用于ARM架构的Anaconda或Miniconda安装包。下载完成后&#xff0c;在终端中使用bash Anaconda3-2019.10-Linux-armv8.sh&#xff08;文件…

Android java基础_异常

一.异常的概念 在Java中&#xff0c;异常&#xff08;Exception&#xff09;是指程序执行过程中可能出现的不正常情况或错误。它是一个事件&#xff0c;它会干扰程序的正常执行流程&#xff0c;并可能导致程序出现错误或崩溃。 异常在Java中是以对象的形式表示的&#xff0c;…

数据加密规范的重要性

数据加密规范是为了保护数据的机密性、完整性和可用性而制定的一系列标准和操作流程。随着信息技术的快速发展&#xff0c;数据已成为企业和组织的核心资产&#xff0c;因此&#xff0c;数据加密变得至关重要。下面将详细介绍数据加密规范的重要性和实施要点。 一、数据加密规范…

MWC 2024丨美格智能发布全新5G-A模组及FWA解决方案,将5.5G带入现实

2月26日&#xff0c;在MWC 2024世界移动通信大会上&#xff0c;美格智能正式宣布推出5G-A模组SRM817WE以及全新的5G-A FWA解决方案&#xff0c;包含5G-A CPE解决方案SRT858M、5G-A MiFi解决方案SRT878H和5G-A ODU解决方案SRT853MX&#xff0c;旨在进一步提升网络性能&#xff0…

CUDA编程 - 用向量化访存优化 - Cuda elementwise - Add(逐点相加)- 学习记录

Cuda elementwise - Add 一、简介1.1、ElementWise Add1.2、 float4 - 向量化访存 二、实践2.1、如何使用向量化访存2.1、简单的逐点相加核函数2.2、ElementWise Add float4&#xff08;向量化访存&#xff09;2.3、完整代码 一、简介 1.1、ElementWise Add Element-wise 操作…

ref()和reactive()

setup(){} ref() 声明响应式状态&#xff0c;ref() 接收参数&#xff0c;并将其包裹在一个带有 .value 属性的 ref 对象中返回&#xff0c;要在组件模板中访问 ref&#xff0c;从组件的 setup() 函数中声明并返回它们。 ref 的好处是&#xff0c;与普通变量不同&#xff0c…

画板CHECK-检测

一, 检查组件是否会压住板上的组件. LBXR20会压住板上的组件. 会压住431管子.431的5V上下电阻要在.用三极管降压到5V时, 记得记得431的输出要放在电容的前面才可以增加反馈的时间.插件的丝印方面或贴片的丝印方面要注意正确,一般都是向外的,今天换那个new-609时,昨天晚上发出的…

【Web】CTFSHOW XXE刷题记录(全)

目录 web373 web374 web375 web376 web377 web378 前置知识先看这篇文章&#xff1a;XXE漏洞学习 用的多的就是外部实体声明和参数实体声明 web373 有回显的xxe <!DOCTYPE test [ <!ENTITY xxe SYSTEM "file:///flag"> ]> <z3r4y> <ct…

C# 学习第二弹

一、变量 存储区&#xff08;内存&#xff09;中的一个存储单元 &#xff08;一&#xff09;变量的声明和初始化 1、声明变量——根据类型分配空间 ①声明变量的方式 —变量类型 变量名 数值&#xff1b; —变量类型 变量名&#xff1b; 变量名 数值&#xff1b; —变…