c++ 继承与派生

news2024/11/25 22:25:50

继承就是在原有类的基础上产生新类,从而减少了代码重复的必要

格式:

class A{};
class B:继承方式 A{};

在c++继承中,有以下几点注意

(1)基类的构造函数与析构函数不能被继承

(2)派生类对基类成员的继承没有选择权,不能选择继承或不继承某些成员

(3)派生类中可以增加新的成员,用于实现新功能,保证派生类的功能在基类基础上有所扩展

(4)一个基类可以派生出多个派生类,一个派生类也可以继承自多个基类

c++中访问权限与继承方式

成员函数

类对象

子类对象

友元函数

友元类

Public

protected

private

了解c++中的访问权限是很有必要的,因为c++中有继承方式,不同的继承方式,派生类对基类中的成员访问权限有所不同,下面介绍三种继承方式

public公有继承

基类中访问权限

public

protected

private

派生类中访问权限

public

protected

不可访问

protected保护继承

基类中访问权限

public

protected

private

派生类中访问权限

ptotected

protected

不可访问

private私有继承

基类中访问权限

public

protected

private

派生类中访问权限

private

private

不可访问

其中private权限无论那种继承方式都是不可访问,但是private成员还是会被继承下,只是被编译器隐藏了,所有的非静态成员都会被继承

#include <iostream>
using namespace std;
#include <string>
class Person {
public:
	int age;
protected:
	int car;
private:
	int money;
};
class American:public Person{

};
int main() {
	American american;
	cout << sizeof(American) << endl;
	cout << sizeof(american) << endl;
}

 可以看到Person 类的三个int 成员都被American类继承下来了,只是私有属性被隐藏了起来,不能访问。

如果掌握了c++的访问权限以及继承方式,剩下就只看程序的需求了,故不在赘述

###############################################

c++ 派生类对象赋值给基类对象

c++中通过公有继承,派生类获得除基类构造函数,析构函数之外的所有公有成员。因此,在语法上,公有派生类对象总是可以充当基类对象,即可以将派生类对象赋值给基类对象,在用到基类对象的地方可以用其公有派生类对象代替,从而调用基类的方法,但不可调用派生类新增的成员。

可以使用的方式:

(1)使用公有派生类对象为基类对象赋值

//Dog类继承自Animal类
Animal animal_3 = dog;

(2)使用公有派生类对象为基类对象的引用赋值

Animal &animal_1 = dog;

(3)使用公有派生类对象为基类指针赋值

Animal* animal_2 = &dog;

 这样 就可以调用父类方法Walk(),但是不可调用子类新增的方法Sound();

	animal_1.Walk();
    //animal_1.Sound();不合法

 这个稍微了解一下,相当于java里的上转型对象

##############################################

c++派生类的构造函数与析构函数

派生类的构造函数要负责调用基类的构造函数进行初始化基类的成员变量

格式:

派生类构造函数名(参数列表):基类1 构造函数名(参数列表),基类2 构造函数名(参数列表)...{
    派生类初始化新增成员变量语句;
}

强调以下几点

(1)构造函数调用顺序:首先按照继承顺序依次调用基类构造函数,如果派生类中有成员对象,第二步调用成员对象的构造函数,最后调用派生类构造函数

(2)基类构造函数的参数要从派生类构造函数的参数列表中获取

(3)如果基类定义了有参构造函数,派生类必须定义构造函数

(4)析构函数调用则与构造函数相反         (栈)

简单示例

class Tom :public Person, public Country {
public:
	string name;
	Car car;
	Tom(string name1, string name2, string name3, string name4);
	~Tom();
	void test();
};
//构造函数示例
Tom::Tom(string name1, string name2, string name3, string name4)
		:Person(name1), Country(name2), car(name3) {
	this->name = name4;
	cout << "调用Tom类构造函数" << endl;
}
int main() {
	Tom tom("人", "美国", "大众", "Tom");
	tom.test();
}

这里省略了Person类,Country类,Car类以及他们的构造函数,我们需要知道Tom派生类的构造函数需要实现基类的有参构造函数,以及实现成员对象的构造函数。也需要知到他们之间调用构造函数和析构函数的顺序。

###############################################

 c++多继承二义性

如果多个基类成员同名则会产生二义性问题,编译器无法区分调用的是哪个基类的成员,这时只要加上作用域即可

如:上一个案例中出现了name 成员出现在好几个基类,这时加上作用域即可

void Tom::test() {
	cout << "这里有一个" << Person::name << ",名字叫" 
		<< this->name << "他来自" << Country::name 
		<<",他总是开着" << car.name << "欣赏沿途的风景" << endl;
}

Person::name,Country::name等 

###################################################

c++ 在派生类中隐藏基类成员函数

在派生类中重新定义基类同名函数,基类同名函数在派生类中被隐藏,通过派生类对象调用同名函数时,调用的是改写后的派生类成员函数,而基类的同名函数不会被调用。

class Animal {
public:
	void Sound();
};
class Dog :public Animal {
public:
	void Sound();
};
int main() {
	Dog dog;
	dog.Sound();
}

 本例中基类与派生类都声明了Sound()方法,其中基类的方法被隐藏。

如果需要调用需加权限符::

int main() {
	Dog dog;
	dog.Animal::Sound();
}

########################################## 

c++虚继承

我们希望间接基类的成员变量在底层派生类中只有一份拷贝,从而避免成员访问的二义性,也有效减少了派生类继承的两份相同的数据而导致的资源浪费。

就比如我们只希望生成CattleHorse类的int age,不需要Animal类,Cattle类,Horse类的int age,但是通过继承又能得到这些数据,如果使用虚继承就能通过虚基类指针访问Animal类的int age数据,也即保留一份数据在Animal类里就ok,需要注意的是这份数据是共享的,也就避免了二义性的出现 

格式:

class 派生类名: virtual 权限控制符 基类名{
};

示例

#include<iostream>
using namespace std;
#include<string>
class Animal {
public:
	int age;
};
class Cattle :virtual public Animal {};
class Horse :virtual public Animal {};
class CattleHorse :virtual public Cattle, virtual public Horse {};
int main() {
	CattleHorse ch;
	ch.age = 6;
	cout << "加上虚继承后,间接基类的成员变量在底层派生类中只有一份拷贝" << endl;
	cout << "ch.Cattle::age=" << ch.Cattle::age << endl;
	cout << "ch.Horse::age=" << ch.Horse::age << endl;
	cout << "ch.Animal::age=" << ch.Animal::age << endl;
}

 可以看到声明了ch.age = 6;后,其它类去访问也是6;是共享的 

查看虚基类表

按win下找到

Visual Studio 2022 Developer Command Prompt

然后 cd到此类的该目录下

然后 cl /d1 reportSingleClassLayout类名 文件名.cpp

 

 被虚继承的类叫虚基类,比如本例中的Animal类。虚基类只是针对虚继承,而不是针对基类本身,在普通继承中,该基类并不称为虚基类

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

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

相关文章

c++ 常用总结(三)

1.设计模式 GitHub - FengJungle/DesignPattern: Design pattern demo code &#xff08;一&#xff09; ① 简单工厂模式 再不学简单工厂模式&#xff0c;就真的要去工厂搬砖啦~_冯Jungle的博客-CSDN博客 通过以下的例子可见&#xff0c;只需要提供产品名称作为参数&…

基于springboot+mysql+SpringDataJPA +html实现学生选课管理系统

基于springbootmysqlSpringDataJPA html实现学生选课管理系统 一、系统介绍1、系统主要功能&#xff1a;2.涉及技术框架&#xff1a;3.本项目所用环境&#xff1a;4.项目需求 二、功能展示三、其它系统四、获取源码 一、系统介绍 1、系统主要功能&#xff1a; 管理员&#xf…

【C++】| 03——STL | 迭代器

系列文章目录 【C】| 01——泛型编程 | 模板 【C】| 02——STL | 初识 【C】| 03——STL | 迭代器 【C】| 04——STL | 容器_vector 文章目录 1. 什么是迭代器2. 迭代器的分类3. 不同容器对应的迭代器4. 迭代器的好处5. 迭代器的操作 1. 什么是迭代器 迭代器就是指向容器内元素…

基于MATLAB的路面裂缝检测识别算法代码(GUI系统设计+图像预处理+裂缝检测)

资源地址&#xff1a; 基于MATLAB的路面裂缝检测识别算法代码&#xff08;GUI系统设计图像预处理裂缝检测&#xff09;资源-CSDN文库 主要内容&#xff1a; 1、运行Gui_Main.m程序&#xff0c;得到GUI界面 2、首先点击载入图像文件 3、后续便可以点击右侧的其他按钮进行分析…

C++linux高并发服务器项目实践 day10

Clinux高并发服务器项目实践 day10 守护进程进程组会话进程组、会话操作函数守护进程守护进程的创建步骤 线程线程和进程的区别线程之间共享和非共享资源线程操作线程创建线程退出线程参与线程分离线程取消 线程属性 守护进程 在UNIX系统中&#xff0c;用户通过终端登录系统后…

DCMM评估之战略维度沟通

01 数据战略规划过程 过程描述&#xff1a; 过程描述如下:a) 识别利益相关者,明确利益相关者的需求;b) 数据战略需求评估,组织对业务和信息化现状进行评估,了解业务和信息化对数据的需求;c) 数据战略制定,包含但不限于:1) 愿景陈述,其中包含数据管理原则、目的和目标;2) 规划…

SpringCloud 远程调用Feign、网关Gateway、配置中心Nacos、微服务架构小结、Nacos搭建集群

统一检查maven maven依赖出错的解决 注意代码格式化。因代码格式混乱&#xff0c;导致代码出错&#xff0c;pom.xml出现重复的parent标签 学习方法&#xff0c;听得懂为什么要这么做&#xff0c;要远远比 怎么做 重要的多 一、远程调用Feign 能够使用Feign进行远程调用能够…

【C++学习】创建二维动态数组

1.指针 创建二维动态数组_牛客题霸_牛客网 (nowcoder.com) 使用指针的指针 使用指针的指针可以很方便地创建动态的二维数组&#xff0c;其关键在于使用两层指针进行分配。 以下是一个动态创建n行m列的二维数组的示例代码&#xff1a; int **arr new int*[n]; // 创建一个…

深度学习训练营J2:ResNet50v2算法分析与实战

深度学习训练营J2:ResNet50v2算法分析与实战 原文链接环境介绍0.引言论文分析与解读1.ResNet50和ResNet50v2之间的结构对比2.不同结构之间的尝试 3.关于激活的不同尝试4.文章结果 ResNet50v2架构复现5.残差结构6.模块构建7.架构展示以及网络构建 8.网络结构打印ResNet50v2完整结…

Python——1

一、注释 &#xff08;1&#xff09;单行注释&#xff1a;#需要注释的内容&#xff08;#&#xff09; &#xff08;2&#xff09;多行注释&#xff1a;需要注释的内容&#xff08;三引号&#xff09; 二、变量及变量类型 1.变量 语法定义&#xff1a;变量名 变量值&#…

【小程序】微信云托管服务

链接 官方文档 云托管官网 特点 无需自提供服务&#xff0c;有云托管平台自动分配&#xff0c;并自动缩容/扩容支持多种语言及模板实例采用容器化管理方式实现服务部署支持小程序内网访问&#xff0c;仅公网测试&#xff0c;提供足够的安全防护&#xff0c;微信用户就近接入…

Python:BeautifulSoup库介绍

BeautifulSoup库介绍 1、BeautifulSoup是Python中的一个第三方库&#xff0c;其最主要的功能是处理HTML文档 ⑴查找HTML文档中的指定标签 ⑵获取HTML文档中指定标签的标签名、标签值、标签属性等 ⑶修改HTML文档中指定标签 2、BeautifulSoup库将HTML文档解析为一…

服务器如何做端口映射,使服务器之间通信,然后访问目标网站(baidu.com)

文章目录 服务器如何做端口映射&#xff0c;使服务器之间通信&#xff0c;然后访问目标网站&#xff08;baidu.com)问题缘由所需环境操作步骤1. 目的服务器设置2. 中间服务器设置3. 修改客户端 总结 服务器如何做端口映射&#xff0c;使服务器之间通信&#xff0c;然后访问目标…

DataX读取Hive Orc格式表丢失数据处理记录

文章目录 问题问题概述问题详细描述 原因解决方法修改源码验证 问题 问题概述 DataX读取Hive Orc存储格式表数据丢失 问题详细描述 同步Hive表将数据发送到Kafka&#xff0c;Hive表A数据总量如下 SQL&#xff1a;select count(1) from A; 数量&#xff1a;19397281使用Dat…

HTML小游戏25 —— HTML5拉杆子过关小游戏(附完整源码)

本节教程我会带大家使用 HTML 、CSS和 JS 来制作一个HTML5拉杆子过关小游戏 ✨ 前言 &#x1f579;️ 本文已收录于&#x1f396;️100个HTML小游戏专栏&#xff1a;100个H5游戏专栏https://blog.csdn.net/qq_53544522/category_12064846.html&#x1f3ae; 目前已有100小游戏…

交叉编译--build、--host、--target、--prefix

一、编译例子 ./configure --build编译平台 --host运行平台 --target目标平台 [各种编译参数]build&#xff1a;表示目前我们正在运行的平台名称是什么&#xff0c;如&#xff1a;当前我们是在电脑上编译该系统&#xff0c;那么我们的 --build 就可能是 x86&#xff0c;如果…

如何避免因为 Kubernetes 和 Kafka 而被解雇

本文由 Bing AI 生成。Bing AI 真是尽显程序员本色&#xff0c;我等它生成文章的过程中发现出现了 Markdown 语法&#xff0c;结果点复制过来的就是直接 Markdown 文档。 Kubernetes 和 Kafka 是两个非常流行的技术&#xff0c;它们分别用于容器编排和分布式消息传递。它们的优…

XSD2Code++ Crack

XSD2Code Crack XSD2Code是为那些希望在将复杂的XML和JSON模式转换为NetCore时节省时间的开发人员设计的。它使用简单且灵活&#xff0c;可以很容易地集成到任何项目中&#xff0c;并适应开发人员的需求。它通过直观、可定制的用户界面&#xff0c;真正提高了生产力。使用XSD2C…

【SpringCloud】初步认识微服务

文章目录 1.认识微服务1.1微服务由来1.2为什么需要微服务&#xff1f; 2.两种架构2.1.单体架构2.2.分布式架构 3.微服务的特点4.SpringCloud5.总结最后说一句 1.认识微服务 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为…

K8s基础10——数据卷、PV和PVC、StorageClass动态补给、StatefulSet控制器

文章目录 一、数据卷类型1.1 临时数据卷&#xff08;节点挂载&#xff09;1.2 节点数据卷&#xff08;节点挂载&#xff09;1.3 网络数据卷NFS1.3.1 效果测试 1.4 持久数据卷&#xff08;PVC/PV&#xff09;1.4.1 效果测试1.4.2 测试结论 二、PV、PVC生命周期2.1 各阶段工作原理…