C++之对封装、继承、多态的理解

2023-11-15

目录

一、对封装、继承和多态的简单理解:

二、举例:

1、封装的例子:

2、继承的例子:

3、多态的例子:

三、代码实现:

1、封装:(C++或Java实现)

2、继承:(C++或Java实现)

3、多态:(C++或Java实现)

四、以一个简单的实例  剖析“封装”的实现过程:

下面以一个Person类为例,演示如何实现封装。


一、对封装、继承和多态的简单理解:

1、封装:将数据和操作数据的方法放在一起,对外部隐藏实现细节。如:一个类中的私有变量私有方法就是封装的体现,外部无法直接访问和操作,只能通过公有的接口方法来访问和操作

2、继承:一个类可以继承另一个类的属性和方法。如:有一个动物类,狗和猫都继承了这个类,它们就可以拥有动物类中的属性和方法,同时也可以添加自己的属性和方法。这样可以避免重复编写相同的代码,提高代码的复用性

3、多态:同一种行为或方法在不同情况下的不同表现形式。如:一个动物类 有一个“叫”的方法狗和猫都继承了这个类,但是它们的叫声是不同的,这就是多态的体现。

二、举例:

1、封装的例子:

        假设有一个人类Person,其中有一个私有变量age表示年龄,同时有一个公有方法getAge用于获取年龄。  这样,外部无法直接访问age变量,只能通过getAge方法来获取年龄,实现了封装

2、继承的例子:

        假设有一个动物类Animal,其中有一个方法叫做“移动”,狗类Dog和猫类Cat都继承了Animal类。这样,狗和猫类就可以拥有Animal类中的“移动”方法,同时也可以添加自己的属性和方法。这样就可以避免重复编写相同的代码,提高代码的复用性,实现了继承。

3、多态的例子:

        假设有一个动物类Animal,其中有一个方法叫做“叫”,这个方法在不同的子类中有不同的实现。比如,狗类Dog的“叫”方法是“汪汪汪”猫类Cat的“叫”方法是“喵喵喵”。这样在调用“叫”方法时,可以根据实际的对象类型来执行不同的方法,实现多态。

三、代码实现:

1、封装:(C++或Java实现)

#include <iostream>
using namespace std;

class Person {
private:
    int age;
public:
    int getAge() {
        return age;
    }
    void setAge(int a) {
        age = a;
    }
};

int main() {
    Person person;
    person.setAge(20);
    cout << "Age: " << person.getAge() << endl;

    return 0;
}
public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        person.setAge(20);
        System.out.println("Age: " + person.getAge());
    }
}

class Person {
    private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int a) {
        age = a;
    }
}

2、继承:(C++或Java实现)

#include <iostream>
using namespace std;

class Animal {
public:
    void move() {
        cout << "Animal moves" << endl;
    }
};

class Dog : public Animal {
public:
    void bark() {
        cout << "Dog barks" << endl;
    }
};

class Cat : public Animal {
public:
    void meow() {
        cout << "Cat meows" << endl;
    }
};

int main() {
    Dog dog;
    Cat cat;

    dog.move();
    dog.bark();

    cat.move();
    cat.meow();

    return 0;
}
public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
        Cat cat = new Cat();

        dog.move();
        dog.bark();

        cat.move();
        cat.meow();
    }
}

class Animal {
    public void move() {
        System.out.println("Animal moves");
    }
}

class Dog extends Animal {
    public void bark() {
        System.out.println("Dog barks");
    }
}

class Cat extends Animal {
    public void meow() {
        System.out.println("Cat meows");
    }
}

3、多态:(C++或Java实现)

#include <iostream>
using namespace std;

class Animal {
public:
    virtual void makeSound() {
        cout << "Animal makes a sound" << endl;
    }
};

class Dog : public Animal {
public:
    void makeSound() {
        cout << "Dog barks" << endl;
    }
};

class Cat : public Animal {
public:
    void makeSound() {
        cout << "Cat meows" << endl;
    }
};

int main() {
    Animal* animal;
    Dog dog;
    Cat cat;

    animal = &dog;
    animal->makeSound();

    animal = &cat;
    animal->makeSound();

    return 0;
}
public class Main {
    public static void main(String[] args) {
        Animal animal;
        Dog dog = new Dog();
        Cat cat = new Cat();

        animal = dog;
        animal.makeSound();

        animal = cat;
        animal.makeSound();
    }
}

class Animal {
    public void makeSound() {
        System.out.println("Animal makes a sound");
    }
}

class Dog extends Animal {
    public void makeSound() {
        System.out.println("Dog barks");
    }
}

class Cat extends Animal {
    public void makeSound() {
        System.out.println("Cat meows");
    }
}

四、以一个简单的实例  剖析“封装”的实现过程:

        当我们设计一个类时,通常会有一些属性和方法。有些属性和方法可能是需要对外公开的,也就是说其他类可以直接访问这些属性和方法;而有些属性和方法则应该是私有的,不对外公开,只能在类内部使用

        这种将类的内部实现细节隐藏起来,只对外暴露必要的接口的做法就是封装。

下面以一个Person类为例,演示如何实现封装。

1、首先,我们需要确定person类需要哪些属性和方法。在本例中,我们需要一个age属性和getAge方法

public class Person {
    private int age;

    public int getAge() {
        return age;
    }
}

2、age属性是私有的,外部无法直接访问,只能通过getAge方法获取

        因此,我们需要提供一个setAge方法,用于设置age的值

public class Person {
    private int age;

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

3、setAge方法中,我们使用了关键字this。this代表当前对象,即调用该方法的对象。在本例中,this.age表示当前对象的age属性,而age表示方法的参数

4、现在,我们已经完成了Person类的封装。在其他类中,如果需要使用Person类的age属性,只能通过getAge方法获取,而不能直接访问age属性。

public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        person.setAge(20);
        System.out.println("Age: " + person.getAge());
    }
}

5、在Main类中,我们创建了一个Person对象,然后使用setAge方法设置age属性的值为20,最后使用getAge方法获取age属性的值,并输出到控制台上

        这就是封装的基本思路和方法。通过将类的内部实现细节隐藏起来,只对外暴露必要的接口,可以提高代码的安全性和可维护性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++之对封装、继承、多态的理解 的相关文章

  • 如何在 Eclipse Java 动态 Web 项目中使用 .properties 文件?

    我正在 Eclipse 中开发动态 Web 项目 我创建了一个 properties 文件来存储数据库详细信息 用户名 密码等 我通过右键单击项目和 New gt File 添加它 我使用了Java util包Properties类 但它不
  • 解决错误javax.mail.AuthenticationFailedException

    我不熟悉java中发送邮件的这个功能 我在发送电子邮件重置密码时遇到错误 希望你能给我一个解决方案 下面是我的代码 public synchronized static boolean sendMailAdvance String emai
  • 如何重置捕获像素的值

    我正在尝试创建一个 C 函数 该函数返回屏幕截图位图中每四个像素的 R G 和 B 值 这是我的代码的一部分 for int ix 4 ix lt 1366 ix ix 4 x x 4 for int iy 3 iy lt 768 iy i
  • 生产代码中的 LRU 实现

    我有一些 C 代码 需要使用 LRU 技术实现缓存替换 目前我知道两种实现LRU缓存替换的方法 每次访问缓存数据时使用时间戳 最后比较替换时的时间戳 使用缓存项的堆栈 如果最近访问过它们 则将它们移动到顶部 因此最后底部将包含 LRU 候选
  • 挂钩 Eclipse 构建过程吗?

    我希望在 Eclipse 中按下构建按钮时能够运行一个简单的 Java 程序 目前 当我单击 构建 时 它会运行一些 JRebel 日志记录代码 我有一个程序可以解析 JRebel 日志文件并将统计信息存储在数据库中 是否可以编写一个插件或
  • 哪个集合更适合存储多维数组中的数据?

    我有一个multi dimensional array of string 我愿意将其转换为某种集合类型 以便我可以根据自己的意愿添加 删除和插入元素 在数组中 我无法删除特定位置的元素 我需要这样的集合 我可以在其中删除特定位置的数据 也
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部
  • g++ 对于看似不相关的变量“警告:迭代...调用未定义的行为”

    考虑以下代码strange cpp include
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • 是否可以有一个 out ParameterExpression?

    我想定义一个 Lambda 表达式out范围 有可能做到吗 下面是我尝试过的 C Net 4 0 控制台应用程序的代码片段 正如您在 procedure25 中看到的 我可以使用 lambda 表达式来定义具有输出参数的委托 但是 当我想使
  • 在android中跟踪FTP上传数据?

    我有一个运行 Android 的 FTP 系统 但我希望能够在上传时跟踪字节 这样我就可以在上传过程中更新进度条 安卓可以实现这个功能吗 现在 我正在使用org apache common net ftp我正在使用的代码如下 另外 我在 A
  • strcmp 给出分段错误[重复]

    这个问题在这里已经有答案了 这是我的代码给出分段错误 include
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • Java &= 运算符应用 & 或 && 吗?

    Assuming boolean a false 我想知道是否这样做 a b 相当于 a a b logical AND a is false hence b is not evaluated 或者另一方面 这意味着 a a b Bitwi
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • 嵌入式 Jetty - 以编程方式添加基于表单的身份验证

    有没有一种方法可以按如下方式以编程方式添加基于表单的身份验证 我用的是我自己的LdapLoginModule 最初我使用基本身份验证并且工作正常 但现在我想在登录页面上进行更多控制 例如显示徽标等 有没有好的样品 我正在使用嵌入式 jett
  • 用于 C# XNA 的 Javascript(或类似)游戏脚本

    最近我准备用 XNA C 开发另一个游戏 上次我在 XNA C 中开发游戏时 遇到了必须向游戏中添加地图和可自定义数据的问题 每次我想添加新内容或更改游戏角色的某些值或其他内容时 我都必须重建整个游戏或其他内容 这可能需要相当长的时间 有没
  • 带重定向标准流的 C# + telnet 进程立即退出

    我正在尝试用 C 做一个 脚本化 telnet 项目 有点类似于Tcl期望 http expect nist gov 我需要为其启动 telnet 进程并重定向 和处理 其 stdin stdout 流 问题是 生成的 telnet 进程在
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public

随机推荐

  • 2019最近计算机毕业设计-题目汇总大全-系列5

    javaweb python爱好者 如果对以下项目感兴趣可以邮箱 cswork2019 163 com 与我沟通交流 课题名称 备注 区块链交易信息的获取与可视化分析 基于2D物理引擎 液体 的H5小游戏 基于Cocos2D的微信小游戏的设
  • 高校圆桌派第三期话题征集强势来袭~

    高校圆桌派 话题风暴等你来 即日起参与 高校圆桌派 活动 就有机会获得CSDN高校圆桌大礼包和CSDN周边礼品免费包邮送到家 高校圆桌派第二期话题征集结果公示 1 刚毕业的程序员有必要执着于进入大厂吗 小厂和大厂怎么选择 2 新能源汽车行业
  • 最简单的获取安卓应用sha1值的方法

    每个安卓应用都有一个签名证书 签名证书可以由jdk生成 当证书生成后 证书就有其sha1值 md5值和sha256值 使用此证书打包后的apk 也有其一样的sha1值 md5值和sha256值 有两种方法可以获取sha1值 1 解压apk
  • 百度:度度熊有一个N个数的数组,他想将数组从大到小排好序...

    度度熊有一个N个数的数组 他想将数组从大到小排好序 但是萌萌的度度熊只会下面这个操作 任取数组中的一个数然后将它放置在数组的最后一个位置 问最少操作多少次可以使得数组从小到大有序 输入描述 首先输入一个正整数N 接下来的一行输入N个整数 N
  • 缤纷多彩的404页面(404.html)

    文章来源 https www skyqian com archives 404 Pages html 一般而言 第一时间会在博客更新 CSDN随缘更新 引言 别离滋味浓于酒 著人瘦 此情不及墙东柳 春色年年如旧 勿埋我心 404是个很常见的
  • Redis以及Jedis的GEO地图功能

    Redis以及Jedis的GEO地图功能 引言 redis是一个高性能的非关系型数据库 作为一个单线程的应用程序 速度非常快 并且不存在多线程情况下的共同资源访问锁的问题 PS 太久没有写文章 老脸一红 今日记录一下Redis的地图坐标功能
  • uthash

    在软件开发中 不可不免的会使用到hash表 hash表的优点这里就不说了 以下介绍一个hash表的C实现 uthash是用宏实现的 使用的时候非常方便 只用包含uthash h即可 Uthash的三个数据结构 1 typedef struc
  • php加密自定义版权,分享几种好用的PHP自定义加密函数(可逆/不可逆)

    项目中有时我们需要使用PHP将特定的信息进行加密 也就是通过加密算法生成一个加密字符串 这些加密后的字符串可以通过解密算法进行解密 便于程序对解密后的信息进行处理 最常见的应用在用户登录以及一些API数据交换的场景 最常见的应用在用户登录以
  • 计算机网络——拥塞控制(1)

    1 拥塞 congestion 当过多的包在网络缓冲区中竞争某个相同链路时 队列会溢出丢包 当这种丢包成为普通事件时 则称网络发生拥塞 简单概述就是对聚合带宽的需求超过了链路的可用容量 1 1 产生原因 宏观原因 网络资源分布不均匀 流量分
  • postman报错:There was an error in evaluating the test script: JSONError: Unexpected token 'n' at 1:15

    1 There was an error in evaluating the test script JSONError Unexpected token n at 1 15 20200509150938nZ5W 原因 格式错误 获取返回数
  • git tag 打标签常用命令

    git tag 查看标签列表 git tag a V1 6 5 m 新增了OCV等 打标签 git show V1 6 5 查看标签详细 git push origin V1 6 5 推送到远程仓库 git tag d V1 6 5 删除标
  • PGP软件的使用实验报告

    PGP软件的使用 一 实验目的 二 实验环境 三 实验原理 四 实验步骤及结果 五 实验总结 一 实验目的 1 通过认识PGP加密过程 加深对加密理论的理解 2 学会使用PGP软件对文件和电子邮件加密 二 实验环境 PC机至少2台 组建成局
  • 数据结构之实现无向图的广度优先搜索算法

    include
  • Spring揭秘 学习笔记一 (Spring的IoC容器 一)

    Spring框架为POJO提供的各种服务共同组成了Spring的生命之树 如图1 1所示 第2章 IoC的基本概念 2 1 IoC全称为Inversion of Control 中文通常翻译为 控制反转 它还有一个别名叫做依赖注入 Depe
  • Docker部署Prometheus

    组件介绍 Prometheus Server 普罗米修斯的主服务器 node exporter 用于机器系统数据收集 mysqld exporter 用于MySQL数据库数据收集 Cadvisor 用于收集宿主机上的docker容器数据 G
  • mysql group by cube_group by、grouping sets、with rollup、with cube方法

    场景 在编写报表的 sql 脚本的时候 可能会遇到多维度组合的情况 例如下面的情况 常规的做法是编写不同维度组合的 sql 然后再使用 union all 进行全集 当分组维度数量比较多的时候 union的sql代码会非常长 但你若熟悉下面
  • SSLv3 存在严重设计缺陷漏洞,整改方法

    发现此问题后 进入WINDOWS注册表 然后修改 注册表进入 HKey Local Machine System CurrentControlSet Control SecurityProviders SCHANNEL Protocols
  • scel转txt抽取词库

    最近需要词库来优化分词效果 找到了有大神写好的能将搜狗词库scel转成txt的python脚本 http blog csdn net zhangzhenhu article details 7014271 实际运行时因为python版本不同
  • Linux常用指令总结

    一 基础指令 1 ls 列出当前路径下的所有文件和目录的名称 ls l 以列表的形式展现所有 ls a 显示隐藏文件 ls h 将列出的文件大小以可读性较好的方式显示 默认单位为字节 文件大小过大 会以合适的单位来进行转化 但必须和 l 一
  • C++之对封装、继承、多态的理解

    目录 一 对封装 继承和多态的简单理解 二 举例 1 封装的例子 2 继承的例子 3 多态的例子 三 代码实现 1 封装 C 或Java实现 2 继承 C 或Java实现 3 多态 C 或Java实现 四 以一个简单的实例 剖析 封装 的实