C++学习笔记——私有继承、多重继承、类模板

news2024/9/24 21:23:52

 

目录

一、私有继承

二、多重继承

三、类模板

四、一个使用私有继承的示例代码

4.1代码

4.2输出结果

五、多重继承案列

六、类模板案例


C++中的继承和模板是非常强大和灵活的特性,它们可以帮助我们实现代码复用、抽象和泛化等目标。本文将着重介绍私有继承、多重继承和类模板这三个C++中比较重要的特性。

一、私有继承

私有继承是一种比较特殊的继承方式,它在语法上与公有继承和保护继承没有太大区别,但是其继承关系所暴露的接口和成员变量都会被隐藏起来,只有派生类自己可以访问到基类的成员。在使用私有继承时,我们通常会借助基类指针或引用来访问基类的成员,而不会直接使用派生类对象。

私有继承的应用场景比较广泛,例如可以用来实现“has-a”关系、模块化设计等。具体来说,如果一个类需要另一个类的部分功能,但是不想公开其接口,可以使用私有继承。此外,私有继承也可以用来防止基类的成员被误操作或滥用,从而提高代码的安全性。

二、多重继承

多重继承是C++中比较复杂和容易出现问题的特性之一,它允许一个派生类同时继承多个基类。多重继承在语法上并不复杂,但是在设计和实现上需要考虑一些问题,例如可能会出现菱形继承问题、基类构造函数的调用顺序等。因此在使用多重继承时需要谨慎考虑其适用性和实现细节。

多重继承的应用场景也比较广泛,例如可以用来实现多态、功能组合等。具体来说,如果一个类需要具有多种不同的特性或行为,可以使用多重继承来组合多个基类。此外,多重继承也可以用来实现接口继承和实现继承的分离,从而更好地实现面向对象的编程思想。

三、类模板

类模板是C++中非常强大和灵活的特性,它允许我们通过一个通用的模板来生成多个具体的类。类模板在定义时需要指定模板参数,这些参数可以是类型、常量、模板等等。类模板可以用来实现泛型编程、容器和算法库等。

类模板的语法比较复杂,但是理解一些基本概念后就可以轻松地应用它们。例如,我们可以使用模板参数来定义成员变量和成员函数,或者使用特化(partial specialization)和偏特化(full specialization)来针对不同的情况实现不同的行为。此外,C++11及以上版本还提供了可变参数模板(variadic template)和模板别名(template alias)等新特性,使得类模板的应用更加灵活和便捷。

 

私有继承是指派生类以 private 访问权限继承基类的成员。这意味着派生类无法直接访问基类的成员,只能通过基类指针或引用来访问。

四、一个使用私有继承的示例代码

4.1代码

#include <iostream>

class Base {
public:
    void display() {
        std::cout << "Base class" << std::endl;
    }
};

class Derived : private Base {
public:
    void showMessage() {
        display();  // 通过基类指针访问基类的成员函数
    }
};

int main() {
    Derived derived;
    derived.showMessage();
    return 0;
}

在这个示例中,Derived 类私有继承 Base 类。Derived 类中的 showMessage() 函数通过基类指针调用了 Base 类的 display() 函数。

4.2输出结果

Base class

私有继承主要用于实现类与类之间的“has-a”关系,即一个类包含另一个类的对象作为其成员。

五、多重继承案列

多重继承是指派生类可以同时继承多个基类。在多重继承中,派生类可以分别指定不同的继承方式(public、protected 或 private)来控制基类成员的访问权限。

下面是一个使用多重继承的示例代码:

#include <iostream>

class Base1 {
public:
    void display1() {
        std::cout << "Base1 class" << std::endl;
    }
};

class Base2 {
public:
    void display2() {
        std::cout << "Base2 class" << std::endl;
    }
};

class Derived : public Base1, private Base2 {
public:
    void showMessage() {
        display1();  // 通过派生类直接访问公有基类的成员函数
        //display2();  // 错误!无法直接访问私有基类的成员函数
    }
};

int main() {
    Derived derived;
    derived.showMessage();
    return 0;
}

在这个示例中,Derived 类同时继承了 Base1Base2 两个基类。Derived 类中的 showMessage() 函数可以直接调用 Base1 类的 display1() 函数,但无法直接调用 Base2 类的 display2() 函数。

输出结果为:

Base1 class

六、类模板案例

类模板允许我们定义通用的类模板,在实例化时可以指定不同的类型、常量和模板参数。

下面是一个使用类模板的示例代码,实现了一个简单的栈(Stack)类模板:

#include <iostream>
#include <vector>

template <typename T>
class Stack {
private:
    std::vector<T> elements;

public:
    void push(const T& value) {
        elements.push_back(value);
    }

    void pop() {
        if (!elements.empty()) {
            elements.pop_back();
        }
    }

    T top() const {
        if (!elements.empty()) {
            return elements.back();
        }
        throw std::out_of_range("Stack is empty.");
    }

    bool empty() const {
        return elements.empty();
    }
};

int main() {
    Stack<int> stack;
    stack.push(1);
    stack.push(2);
    stack.push(3);

    while (!stack.empty()) {
        std::cout << stack.top() << " ";
        stack.pop();
    }
    std::cout << std::endl;

    return 0;
}

在这个示例中,Stack 是一个类模板,可以使用不同类型的数据来实例化。在 main() 函数中,我们使用 Stack<int> 来创建一个整数类型的栈,并依次将元素压入栈中,然后通过 top()pop() 函数来访问和删除栈顶元素。

输出结果为

3 2 1

类模板可以实现更加灵活的泛型编程,通过指定模板参数来确定类模板中的具体类型、常量和模板参数。这使得类模板在STL(标准模板库)的容器类(如 vectorlistmap 等)中得到了广泛应用。

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

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

相关文章

如何公网远程访问Linux AMH服务器管理面板【内网穿透】

⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 文章目录 ⛳️ 推荐1. Linux 安装AMH 面板2. 本地访问AMH 面板3. Linux安装Cpolar4. 配置AMH面板公网地址5. 远程访问AMH面板6…

RibbonGroup添加QLabel

RibbonGroup添加 QLabel&#xff1a; QLabel *pLabel new QLabel(tr("Label:QLabel Sample")); pLabel->setToolTip(tr("Label")); groupClipboard->addWidget(pLabel); 添加文本&#xff1a;

nodejs+vue+ElementUi音乐分享社交网站77l8j

本文介绍的系统主要分为两个部分&#xff1a;一是前台界面&#xff1a;用户通过注册登录可以实现音乐播放、新闻浏览、留言评论等功能&#xff1b;另一个是后台界面&#xff1a;音乐网站管理员对用户信息进行管理&#xff0c;上传更新音乐资源&#xff0c;发布最新音乐资讯等功…

测试工程师能否作为一份「终身职业」?30岁+怎么办?

【讨论】测试工程师可否作为一份终生的职业&#xff1f; 这是我在论坛看到的一个讨论&#xff0c;你的答案是什么呢&#xff1f; 我希望大家能认真思考后给出一个属于自己的答案&#xff0c;无论你是新手入门&#xff0c;还是资深专家。回答这个问题请不要凭一腔热血&#xff…

【SAP】如何删除控制范围

经历就是财富&#xff0c;可你终将遗忘。期望文字打败时间。 本周心惊胆战地在配置系统删除了一个控制范围&#xff0c;还是有些收获&#xff0c;特此记录一下。 背景&#xff1a;在删除控制范围之前&#xff0c;我主要做了如下配置。 定义控制范围&#xff08;自动生成了成本…

Spark---累加器

1.累加器实现原理 累加器用来把 Executor 端变量信息聚合到 Driver 端。在 Driver 程序中定义的变量&#xff0c;在Executor 端的每个 Task 都会得到这个变量的一份新的副本&#xff0c;每个 task 更新这些副本的值后&#xff0c;传回 Driver 端进行 merge。 //建立与Spark框架…

【MATLAB】逐次变分模态分解SVMD信号分解算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 1 基本定义 逐次变分模态分解&#xff08;Sequential Variational Mode Decomposition&#xff0c;简称SVMD&#xff09;是一种用于信号处理和数据分析的方法。它可以将复杂的信号分解为一系列模态函数&#xff0c;每个…

状态图作业

状态图作业 一. 简答题&#xff08;共7题&#xff0c;100分&#xff09; (简答题) 什么是状态&#xff0c;对象的状态和对象的属性有什么区别&#xff1f; 正确答案&#xff1a; 状态是指在对象生命周期中满足某些条件、 执行某些活动或等待某些事件的一个条件和状 况。属性表…

函数的秘密

1. 函数的概念 在数学中我们学习过函数&#xff0c;而在C语言中其有着与数学不同的概念&#xff1a; 在C语言中&#xff0c;函数是指一组执行特定任务的语句&#xff0c;这些语句可以重复使用&#xff0c;并且可以在程序的不同部分调用。通过使用函数&#xff0c;程序员可以将…

sectigo dv证书适合场景买一年送一月

Sectigo是成立于美国的知名CA认证机构&#xff0c;随着互联网的发展&#xff0c;Sectigo颁发了越来越多的SSL数字证书。这些SSL证书产品不仅可以对网站传输数据进行加密服务&#xff0c;还可以对服务器身份进行认证服务。Sectigo旗下的DV证书产品比较齐全&#xff0c;适用场景也…

腾讯云TDSQL TCA/TCP/TCE 认证考试有什么区别呢?

腾讯云认证等级&#xff1a;专项认证考试&云方向认证考试 一、专项认证考试 数据库交付运维-腾讯云TDSQL认证考试一共分为三个等级&#xff1a; 初级TCA、高级工程师TCP、专家级TCE 1、TDSQL TCA培训(MySQL版/PostgreSQL版)考试安排 TCA考试是纯理论题&#xff0c;总分是…

全新加密叙事,以Solmash为代表的 LaunchPad 平台如何为用户赋能?

铭文市场的火爆带来“Fair Launch”这种全新的代币启动方式&#xff0c;Fair Launch 的特点在于其为所有人参与 Launch 带来了公平的机会&#xff0c;所有链上玩家们都需要通过先到先得的方式 Mint 资产&#xff0c;VC 在 Fair Launch 中几乎没有话语权&#xff0c;不同的投资者…

Java医院管理系统HIS源码带小程序和安装教程

Java医院管理系统HIS源码带小程序和安装教程该项目是用springbootlayuishiro写的医院管理系统&#xff0c;该系统的业务比较复杂&#xff0c;数据库一共有36张表。项目的视频业务参考文档&#xff0c;都在百度云盘中&#xff0c;可以先看看视频和参考文档。 项目分为门诊管理、…

计算机毕设项目(二)基于django+vue+sqlite实现自适应学习系统,在线考试系统

文章目录 自适应学习系统功能介绍分权分域用户管理考试与练习管理练习记录管理学习内容管理其他功能管理界面部分源码展示完整代码 自适应学习系统功能介绍 这个系统是一个基于Django框架的Python在线考试和学习平台。vuedjango在线学习系统&#xff0c;在线考试系统。数据库使…

HTML--图片

HTML中使用 img标签来显示一张图片 它有三个属性&#xff1a; src alt tiltle src属性&#xff1a; 图片路径建议为相对路径&#xff0c;以免文件移动造成无法正常工作 用法&#xff1a; <img src"图片路径和名字"><!DOCTYPE html> <html> <…

PHP代码审计基础知识

前言 本文章主要是PHP代码审计的一些基础知识&#xff0c;包括函数的用法&#xff0c;漏洞点&#xff0c;偏向基础部分&#xff0c;个人能力有限&#xff0c;部分可能会出现错误或者遗漏&#xff0c;读者可自行补充。 代码执行 代码执行是代码审计当中较为严重的漏洞&…

计算机毕业设计——SpringBoot仓库管理系统(附源码)

1&#xff0c;绪论 1.2&#xff0c;项目背景 随着电子计算机技术和信息网络技术的发明和应用&#xff0c;使着人类社会从工业经济时代向知识经济时代发展。在这个知识经济时代里&#xff0c;仓库管理系统将会成为企业生产以及运作不可缺少的管理工具。这个仓库管理系统是由&a…

【Huggingface】如何访问Huggingface,Huggingface镜像

镜像站&#xff1a; https://hf-mirror.com/本站域名 hf-mirror.com&#xff0c;用于镜像 huggingface.co 域名。 更多用法&#xff08;多线程加速等&#xff09;详见这篇文章。简介&#xff1a; 方法一&#xff1a;使用huggingface 官方提供的 huggingface-cli 命令行工具。…

Centos7.9服务器编译安装Nginx1.24.0和php8.3

Centos7.9服务器编译安装Nginx1.24.0和php8.3 服务器nginx原版本有安全漏洞,需要升级,由于原始是yum源安装,通过yum直接升级,无法正常升级完成,故而需要卸载yum源,重新编译安装。 1、查看原来nginx版本,ps查看原来nginx进程,运行状态: ps aux | grep nginx ​ root …

深入浅出的说地弹(即地噪声)

1. 什么是地弹&#xff0c;地弹的概念&#xff0c;为何叫地弹 地弹、振铃、串扰、信号反射这几个在信号完整性分析总是分析的重点对象。初学者一看&#xff1a;好高深&#xff01;其实&#xff0c;感觉高深是因为你满天听到“地弹”二字&#xff0c;却到处找不到“地弹…