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

 

目录

一、私有继承

二、多重继承

三、类模板

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

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 等)中得到了广泛应用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

对快速排序思想的进一步理解,分而治之,欧几里得算法(常用求最大公约数的方法)

自己找到的最优的快排的代码 快速排序 思想 分而治之使用欧几里得算法&#xff08;辗转相除法&#xff09;来求解一个应用题 假设有一块地&#xff0c;现在用这个同样大小的正方形来铺满&#xff0c;求所可用的最大的正方形地砖的面积 这两个方法放在一起是因为这个欧几里得要…

MAVROS的进一步理解

一、Mavros简介 顾名思义&#xff0c; mavros就是mavlinkros。mavros是PX4官方提供的一个运行于ros下收发mavlink消息的工具&#xff0c;利用mavros可以发送mavlink消息给飞控(可以控制飞机)&#xff0c;并且可以从飞控中接受数据(例如&#xff1a;飞控的位置速度 IMU数据等等…

30 树的定义

树的定义 树的度&#xff1f;叶节点&#xff1f; 注意&#xff1a;k为叶节点 孩子/双亲/子孙/祖先 树的高度&#xff1f; 有序树 森林 树的一些操作&#xff1a; 粗略的框架代码&#xff1a; 省略。。。 小结&#xff1a; 树是线性表的扩展

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

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

基于蚁群算法的TSP问题建模求解(Python)

基于蚁群算法的TSP问题建模求解 一、蚁群优化算法&#xff08;Ant Colony Optimization&#xff0c;ACO&#xff09;1.1 蚁群算法的起源——“双桥实验”1.2 蚁群优化算法思想1.3 蚁群算法应用于求解组合优化问题 二、基于蚁群算法的TSP问题建模求解2.1 旅行商问题&#xff08;…

软件测试|web自动化测试神器playwright教程(三十八)

简介 在我们使用selenium时&#xff0c;我们可以获取元素的属性&#xff0c;元素的文本值&#xff0c;以及输入框的内容等&#xff0c;作为比selenium更为强大的web自动化测试神器&#xff0c;playwright也可以实现对元素属性&#xff0c;文本值和输入框内容的抓取&#xff0c…

Mysql事务的处理

1、事务&#xff0c;就是一组命令的操作。 不过这一组命令&#xff0c;我们有时候需要使用手动提交&#xff1b; 1、使用这组命令可以查询出来现在的提交方式&#xff1a;自动提交&#xff08;就是命令输入&#xff0c;点击enter后&#xff0c;会不会直接对表格产生修改&#x…

重温经典struts1之自定义全局异常处理类处理异常以及<exeception>标签的配置

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 前面的文章&#xff0c;我们学习了&#xff0c;Action类中调用Service&#xff0c;通过try…catch代码块&#xff0c;catch自定义异常类&#xff0c;通过ActionMessage…

metrics安装异常原因【doesn‘t contain any IP SANs】

1、问题背景 安装好k8s后&#xff0c;安装metrics-server后发现对应的pod一直无法启动。 apiVersion: v1 kind: ServiceAccount metadata:labels:k8s-app: metrics-servername: metrics-servernamespace: kube-system --- apiVersion: rbac.authorization.k8s.io/v1 kind: Cl…

05.neuvector网络学习与管控实现

原文链接&#xff0c;欢迎大家关注我的github 一、网络的策略学习 1.1.非主机模式的网络连接学习 agent进程侧&#xff1a; 调用taskAddContainer->taskInterceptContainer->programDP->DPCtrlAddTapPort为所有非host模式的容器向dp传送 DPAddTapPortReq对象数据.&…

成就动机测试

成就动机测试广泛应用在职业发展领域&#xff0c;如&#xff1a;企业Hr人力资源管理部门&#xff0c;用于评估分析员工的潜能和价值&#xff0c;适用场景有人才招聘&#xff0c;岗位晋升&#xff0c;绩效考评等等。在大学生做职业规划&#xff0c;求职应聘中&#xff0c;应用成…

数据结构与算法(十一) 排序算法一

int nArray[] { 8,5,3,2,7 };如下一个数组&#xff0c;现对其进行从小到大排序 选择排序 选择排序&#xff1a;将小的依次放在前面 具象化如下&#xff1a; void swap(int *nSValue,int *nDValue) 交换函数 { int nTempValue 0; nTempValue *nSValue; *nSVal…

Spring Boot 整合支付宝实现在线支付方案(沙箱环境)

文章目录 1.理解沙箱环境2.沙箱环境接入准备2.1 访问开发者控制台2.2 获取重要信息2.3 处理秘钥 3.接入支付宝支付的流程4.实现支付4.1 添加 SDK 依赖4.2 创建配置类4.3 支付宝订单管理接口实现流程4.4 支付宝支付接口实现流程 5.支付宝支付功能演示7.总结 TIP&#xff1a;对于…

分享一个好用的免费在线扣图网址

具体效果 附地址 https://cutout.aiwave.cc/

【python】基础知识类的语法功能讲解

Python代码定义了一个名为Calculation的类&#xff0c;用于执行基础的数学运算&#xff08;加法、减法、乘法、除法和取模&#xff09;。下面我将详细解释各个部分的功能&#xff0c;并以列表形式总结&#xff1a; 类定义&#xff1a; class Calculation: 定义了一个名为Cal…

iOS Universal Links(通用链接)详细教程

一&#xff1a;Universal Links是用来做什么的&#xff1f; iOS9.0推出的用于应用之间跳转的一种机&#xff0c; 通过一个https的链接启动app。如果手机有安装需要启动的app&#xff0c;可实现无缝跳转。如果没有安装&#xff0c;会打开网页。 实现场景&#xff1a;微信链接无…

Flink窗口(2)—— Window API

目录 窗口分配器 时间窗口 计数窗口 全局窗口 窗口函数 增量聚合函数 全窗口函数&#xff08;full window functions&#xff09; 增量聚合和全窗口函数的结合使用 Window API 主要由两部分构成&#xff1a;窗口分配器&#xff08;Window Assigners&#xff09;和窗口函…

Memcache简介与运维

开源、高性能、高并发的分布式内存缓存系统。 作用 缓存关系型数据库的结果&#xff0c;减少数据库自身访问的次数。 常见内存缓存服务软件对比 memcache 纯内存 redis、memcachedb 可持久化存储&#xff0c;同时会使用磁盘存 …

Typora使用及Markdow学习笔记1

编程如画&#xff0c;我是panda&#xff01; 最近有在学习Markdown&#xff0c;所以这次分享一下我的Markdown学习笔记 目录 前言 一、标题 二、段落 1.换行 2.分割线 三、文字显示 1.字体 2.上下标 四、列表 1.无序列表 2.有序列表 3.任务列表 五、区块 六、代…

外包干了5个月,感觉技术退步明显......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入武汉某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01; 而我已经在一个企业干了四…