C++面向对象-继承,多态,重载

目录

零. 简介

一. 继承

1.基类,派生类

2.访问控制和继承:

3.多继承

二. 多态

关键字 virtual override :

用例:工厂模式

三. 重载

函数重载:

操作符重载:


零. 简介

  • 继承:允许一个类从另一个类获取属性和方法。子类可以继承父类的特性,并可以进行扩展和修改。
  • 多态:基于继承的特性,使得不同的子类可以对同一方法进行不同的实现。
  • 重载:是指函数或操作符在同一作用域内具有多个不同的定义,根据参数列表的不同来区分。

一. 继承

1.基类,派生类

子类可以直接继承父类公开和保护的属性和方法.

代码:

#include<iostream>
#include<vector>
#include <string>


class Animal {

protected:
    int age = 10;

public:
    std::string m_name;
    void makeSound() {
        std::cout<< m_name << "叫;   " <<"年龄: " <<age<< std::endl;
    }
};

class Dog : public Animal {

     
public:
    Dog() {
        age = 1;
    }
};
class Cat : public Animal {

public:
    Cat() {
        age = 2;
    }
};

int main() {
    Dog dog;
    dog.m_name = "小狗";
    dog.makeSound();  // 输出:Barking

    Cat cat;
    cat.m_name = "小猫";
    cat.makeSound();  // 输出:Barking



    return 0;
}

2.访问控制和继承:

访问publicprotectedprivate
同一个类yesyesyes
派生类yesyesno
外部的类yesnono

3.多继承

代码

#include<iostream>

using namespace std;

class DogRed {
  
public:
    void Run() {
        cout << "小狗跑" << endl;
  }
};
class DogBlue {

public:
    void Eat() {
        cout << "小狗吃" << endl;
    }
};

class Dog : public DogRed, public DogBlue {


};

int main() {

    Dog dog;
    dog.Run();
    dog.Eat();

    return 0;
}

继承所有父类的公共,保护的属性和方法.

二. 多态

代码:

#include <iostream>

class Animal {
public:
    virtual void makeSound() {
        std::cout << "动物叫" << std::endl;
    }
};

class Dog : public Animal {
public:
    void makeSound() override {
        std::cout << "小狗叫" << std::endl;
    }
};
class Cat : public Animal {
public:
    void makeSound() override {
        std::cout << "小猫叫" << std::endl;
    }
};
int main() {
    Animal* dog = new Dog();  // 使用基类指针指向派生类对象
    dog->makeSound();          // 多态:根据实际对象类型调用相应的函数
    delete dog;

    Animal* cat = new Cat();  // 使用基类指针指向派生类对象
    cat->makeSound();          // 多态:根据实际对象类型调用相应的函数
    delete cat;
    return 0;
}

关键字 virtual override :

  • virtual:用于在基类中声明虚函数。虚函数允许在运行时根据对象的实际类型来确定要调用的函数。
  • override:(C++11 及以上版本)用于在派生类中明确表示要重写基类的虚函数。

用例:工厂模式

多态在工厂模式中是一个常见的应用.使用多态实现了不同具体产品类的操作。通过工厂类创建不同类型的产品对象,然后调用它们的共同方法.

简单的工厂模式代码示例:

#include <iostream>

// 抽象产品类
class Product {
public:
    virtual void operate() = 0;
};

// 具体产品类 1
class ConcreteProduct1 : public Product {
public:
    void operate() override {
        std::cout << "ConcreteProduct1 operate()" << std::endl;
    }
};

// 具体产品类 2
class ConcreteProduct2 : public Product {
public:
    void operate() override {
        std::cout << "ConcreteProduct2 operate()" << std::endl;
    }
};

// 工厂类
class Factory {
public:
    Product* createProduct() {
        return new ConcreteProduct1();
    // 可以根据需要返回不同的具体产品对象
    // 例如:return new ConcreteProduct2();
    }
};

int main() {
    Factory factory;
    Product* product = factory.createProduct();
    product->operate();

    return 0;
}

三. 重载

重载的优点包括:

  1. 提高代码的可读性和可维护性:使用有意义的函数名来处理不同类型的数据。
  2. 提供了更灵活的编程接口:可以根据具体需求使用不同的函数实现。

函数重载:

截图:

代码:

#include <iostream>

void print(int value) {
    std::cout << "Integer: " << value << std::endl;
}

void print(double value) {
    std::cout << "Double: " << value << std::endl;
}

int main() {
    print(42);
    print(3.14);

    return 0;
}

在上面的示例中,定义了两个 print 函数,一个接受整数参数,另一个接受双精度浮点数参数,这就是函数重载。

操作符重载:

代码:

#include <iostream>

class MyClass {
private:
    int value;
public:
    MyClass(int val) : value(val) {}

    MyClass operator+(const MyClass& other) {
        return MyClass(value + other.value);
    }

    void display() {
        std::cout << "Value: " << value << std::endl;
    }
};

int main() {
    MyClass obj1(5);
    MyClass obj2(3);

    MyClass result = obj1 + obj2;

    result.display();  // 输出结果

    return 0;
}

在上面的示例中,重载了 + 操作符,使得可以对两个 MyClass 对象进行相加操作,并返回一个新的 MyClass 对象。通过重载操作符,可以提供更直观和自然的语法来操作类的对象。

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

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

相关文章

python11 序列的相关操作

枚举遍历 序列的相关操作 text "hello,python" # in 判断字符是否在序列中&#xff0c;存在返回true,否则返回false print(p是否存在:,(p in text)) print(a是否存在:,(a in text)) # not in 判断字符不在序列中&#xff0c;不存在返回true,否则返回false print(p不…

代码随想录——二叉搜索树的最近公共祖先(Leetcode235)

题目链接 普通递归法 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val x; }* }*/class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode…

python猴子补丁Monkey Patching

猴子补丁&#xff08;Monkey Patching&#xff09;是一种动态修改或扩展代码行为的技术。具体来说&#xff0c;它是在运行时改变或扩展模块、类或函数的行为&#xff0c;而不需要修改源代码本身。这在某些情况下非常有用&#xff0c;比如&#xff1a; 修复第三方库中的bug&…

MySQL中所有常见知识点汇总

存储引擎 这一张是关于整个存储引擎的汇总知识了。 MySQL体系结构 这里是MySQL的体系结构图&#xff1a; 一般将MySQL分为server层和存储引擎两个部分。 其实MySQL体系结构主要分为下面这几个部分&#xff1a; 连接器&#xff1a;负责跟客户端建立连 接、获取权限、维持和管理…

C++高级 - 接口模板

目录 一. 接口 二. 模板 一. 接口 接口通常是通过抽象类或纯虚函数来实现的。 以下是一个使用抽象类来定义接口的示例代码&#xff1a; #include <iostream>class Interface { public:virtual void operation() 0; // 纯虚函数定义接口 };class ConcreteClass : pu…

Windows CMD对MySQL进行基本操作的常用命令

目录 前言1. 数据库操作2. 表操作3. 记录操作4. 备份与恢复数据库 前言 对于基本的命令行以及优化推荐阅读&#xff1a; 数据库中增删改常用语法语句&#xff08;全&#xff09;Mysql优化高级篇&#xff08;全&#xff09;命令行登录Mysql的详细讲解 启动MySQL服务&#xff1…

渐开线花键学习之齿厚(实际作用怎么分?)

国标GB/T 3478.1-2008中对渐开线花键的齿厚相关的描述如下&#xff1a; 【基本齿槽宽】E&#xff08;basic space width&#xff09;内花键分度圆上弧齿槽宽的基本尺寸&#xff0c;其值为齿距的一半。 【实际齿槽宽】&#xff08;actual space width&#xff09;在内花键分度…

机器学习算法 —— 逻辑回归

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 目录 逻辑回归逻辑回归的介绍逻辑回归的优点逻辑回归的缺点逻辑回归的应用 实践演示库函数导入模型训练模型参数查看数据和模型可视化模型预测 …

CCIG 2024:大模型技术及其前沿应用论坛深度解析

一、CCIG论坛介绍 中国图象图形大会&#xff08;CCIG 2024&#xff09;是一场备受瞩目的学术盛会&#xff0c;近期在陕西省西安市曲江国际会议中心举行。这次会议以“图聚智生&#xff0c;象合慧成”为主题&#xff0c;由中国图象图形学学会主办&#xff0c;旨在汇聚图像图形领…

12 - 常用类

那就别跟他们比&#xff0c;先跟自己比&#xff0c;争取今天比昨天强一些&#xff0c;明天比今天强一些。 1.包装类 针对八种基本数据类型封装的相应的引用类型。 有了类的特点&#xff0c;就可以调用类中的方法。&#xff08;为什么要封装&#xff09; 基本数据类型包装类b…

b端系统项目进度巡检设备物资劳务台账等OA前端UI设计开发

b端系统项目进度巡检设备物资劳务台账等OA前端UI设计开发

phpstudy配置的站点不能访问了

无法打开站点 打开网站的时候出现如下 没有人为主动去更改配置项&#xff0c;今天就不能正常访问了 检查了一遍配置&#xff0c;发现并无大碍&#xff0c;那就重新配置一遍看看 配置phpstudy 1、新建网站 2、选择项目入口文件夹 3、配置伪静态 4. 确认保存 在我的电脑 C:\…

公安视频图像信息数据库及GA/T 1400视图库视频监控系统的使用场景

随着科技的快速发展&#xff0c;大数据、人工智能等新技术不断融入各行各业&#xff0c;为各行各业带来了前所未有的变革。在公安领域&#xff0c;GA/T 1400协议公安视频图像信息数据库的应用为视频监控场景提供了强有力的支持&#xff0c;极大地提升了公安工作的效率和准确性。…

风管静压箱的作用及选型

1.压力的种类 动压—由风速而产生的压力&#xff1b;空调厂家设计时均已经考虑&#xff0c;无需计算。静压—垂直作用于风管壁面的压力&#xff0c;用于克服风管阻力&#xff1b;所以&#xff0c;对于风管机组有零静压和带静压之分&#xff0c;零静压指静压为0Pa&#xff0c;不…

VUE3 学习笔记(14):VUE3 组合式API与传统选项式API用法

VUE3相较VUE2的亮点很多&#xff0c;作为后端开发置于前端最大的感受就是组合式API&#xff08;之前采用的是选项式API&#xff09;&#xff1b;它使得整体更简洁易用,但值得提醒的是官方并未强制要求二选一&#xff0c;尽管如此在同一个项目中还是不要出现两种写法。 选项式AP…

SpringCloud 微服务中网关如何记录请求响应日志?

在基于SpringCloud开发的微服务中&#xff0c;我们一般会选择在网关层记录请求和响应日志&#xff0c;并将其收集到ELK中用作查询和分析。 今天我们就来看看如何实现此功能。 日志实体类 首先我们在网关中定义一个日志实体&#xff0c;用于组装日志对象 Data public class …

U-Net: Convolutional Networks for Biomedical Image Segmentation--论文笔记

U-Net: Convolutional Networks for Biomedical Image Segmentation 资料 1.代码地址 2.论文地址 https://arxiv.org/pdf/1505.04597 3.数据集地址 论文摘要的翻译 人们普遍认为&#xff0c;深度网络的成功训练需要数千个带注释的训练样本。在本文中&#xff0c;我们提出…

“GPT-4o深度解析:技术演进、能力评估与个人体验综述“

文章目录 每日一句正能量前言对比分析模型架构性能应用场景用户体验技术创新社区和生态系统总结 技术能力语言生成能力语言理解能力技术实现总结 个人感受关于GPT-4o的假设性观点&#xff1a;关于当前语言模型的一般性观点&#xff1a; 后记 每日一句正能量 又回到了原点&#…

【前端】display:none和visibility:hidden两者的区别

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。公粽号&#xff1a;洲与AI。 &#x1f913; 欢迎大家关注我的专栏&#xff0c;我将分享Web前后端开发、…

电机行业MES生产管理系统--助力电机企业数字化转型

电机行业 MES 系统是一个综合生产管理系统&#xff0c; 融合了工厂企业必要的销售、 物 流和制造管理等全公司基础业务以及生产计划和现场监测管理。 一、传统机电行业的管理难题&#xff1a; 1、 产品标准化程度较低&#xff0c; 制造工艺复杂&#xff0c; 生产周期较长&#…