当前位置: 首页 > article >正文

c++学习:封装继承多态

目录

封装

封装的定义

封装的好处

封装的实例

继承

继承的定义

继承的好处

继承的实例

多态

多态的定义

多态的好处

多态的实例


封装

封装的定义

封装是面向对象编程(OOP)中的一个核心概念,它指的是将数据(属性)和操作这些数据的函数(方法)结合在一起的过程,以此来模拟现实世界中的实体。在C++中,封装主要通过类(class)和结构体(struct)来实现,同时使用访问修饰符(public、protected、private)来控制成员的可见性。

这样可以隐藏类的内部实现细节,只暴露出限定的接口供外界访问。

封装的好处

  • **数据隐藏**:通过隐藏内部实现细节,只暴露必要的接口,提高代码的安全性。
  • **模块化**:将功能划分为独立的模块,有助于降低复杂性,提高代码的可维护性。
  • **接口设计**:设计清晰、简单且一致的接口,使库更容易使用。
  • **代码重用**:封装可以提高代码的可重用性,因为其他开发者可以在不了解具体实现的情况下使用这些类和对象。
封装的实例
#include <iostream>
#include <string>

class Animal {
private:
    std::string name;
    int age;

public:
    // 设置名字的方法
    void setName(const std::string& n) {
        name = n;
    }

    // 设置年龄的方法
    void setAge(int a) {
        age = a;
    }

    // 获取名字的方法
    std::string getName() const {
        return name;
    }

    // 获取年龄的方法
    int getAge() const {
        return age;
    }
};

int main() {
    Animal dog;
    dog.setName("Buddy");
    dog.setAge(3);

    std::cout << "Name: " << dog.getName() << ", Age: " << dog.getAge() << std::endl;

    return 0;
}

在这个示例中,我们定义了一个名为 `Animal` 的类,它具有两个私有成员变量 `name` 和 `age`。我们没有直接访问这些变量,而是通过公共成员函数(`setName`、`setAge`、`getName` 和 `getAge`)来设置和获取它们的值。这就是封装的一个典型应用。 

继承

继承的定义

继承是面向对象编程中的一个核心概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。通过继承,子类可以重用父类的代码,减少重复代码,提高代码的可维护性和可扩展性。

继承的基本语法

在C++中,继承的基本语法如下:

class ParentClass {
    // 父类的属性和方法
};

class ChildClass : public ParentClass {
    // 子类的属性和方法
};

在这个示例中,`ChildClass` 是 `ParentClass` 的子类,它可以访问 `ParentClass` 中的所有公共方法和属性。

继承的好处
  • **代码重用**:子类可以重用父类的代码,避免重复编写相似的代码。
  • **易于维护**:当父类中的代码需要修改时,只需修改父类,所有子类将自动继承这些更改。
  • **扩展性强**:可以轻松地添加新子类而不需要修改现有代码。
继承的类型

C++支持三种继承类型:

  • **公有继承(Public Inheritance)**:子类可以访问父类的所有公共成员和保护成员。
  • **保护继承(Protected Inheritance)**:子类可以访问父类的所有保护成员,但父类的公共成员对子类不可见。
  • **私有继承(Private Inheritance)**:子类只能访问父类的私有成员,父类的公共和保护成员对子类不可见。
继承的实例

#include <iostream>
#include <string>

// 基类 Animal
class Animal {
protected:
    std::string name;
    int age;

public:
    // 设置名字的方法
    void setName(const std::string& n) {
        name = n;
    }

    // 设置年龄的方法
    void setAge(int a) {
        age = a;
    }

    // 获取名字的方法
    std::string getName() const {
        return name;
    }

    // 获取年龄的方法
    int getAge() const {
        return age;
    }
};

// 派生类 Dog,继承自 Animal
class Dog : public Animal {
public:
    // Dog 类特有的方法
    void bark() const {
        std::cout << "Woof! Woof!" << std::endl;
    }
};

int main() {
    Dog myDog;
    myDog.setName("Buddy");
    myDog.setAge(3);
    myDog.bark();

    std::cout << "Name: " << myDog.getName() << ", Age: " + std::to_string(myDog.getAge()) << std::endl;

    return 0;
}

在这个示例中,我们定义了一个名为 `Animal` 的基类,它具有两个受保护的成员变量 `name` 和 `age`,以及一些公共成员函数(`setName`、`setAge`、`getName` 和 `getAge`)。然后,我们定义了一个名为 `Dog` 的派生类,它继承自 `Animal` 类。`Dog` 类具有一个特有的方法 `bark`。在 `main` 函数中,我们创建了一个 `Dog` 类的对象,并调用了它的方法。
 

多态

多态的定义

多态 (Polymorphism):多态是指允许不同的类具有相同的接口,但具体实现方式可能不同。这使得我们可以使用相同的接口来操作不同的对象,而具体的行为由对象的实际类型决定。

  C++ 中实现多态主要通过虚函数(virtual function)和纯虚函数(pure virtual function)来实现。

多态的好处
  • **代码灵活性**:多态允许我们使用相同的接口来操作不同的对象,而具体的行为由对象的实际类型决定。
  • **易于扩展**:当需要添加新的派生类时,只需实现相应的接口,而不需要修改现有代码。
  • **代码解耦**:多态有助于降低代码间的耦合度,提高代码的可维护性。
多态的实例
#include <iostream>
#include <string>

// 基类 Animal
class Animal {
public:
    // 虚函数 makeSound,实现多态
    virtual void makeSound() const {
        std::cout << "The animal makes a sound." << std::endl;
    }
};

// 派生类 Dog,继承自 Animal
class Dog : public Animal {
public:
    // 重写基类的 makeSound 方法
    void makeSound() const override {
        std::cout << "Woof! Woof!" << std::endl;
    }
};

// 派生类 Cat,继承自 Animal
class Cat : public Animal {
public:
    // 重写基类的 makeSound 方法
    void makeSound() const override {
        std::cout << "Meow! Meow!" << std::endl;
    }
};

int main() {
    Animal* animal1 = new Dog();
    Animal* animal2 = new Cat();

    animal1->makeSound(); // 输出 "Woof! Woof!"
    animal2->makeSound(); // 输出 "Meow! Meow!"

    delete animal1;
    delete animal2;

    return 0;
}


在这个示例中,我们定义了一个名为 `Animal` 的基类,它具有一个虚函数 `makeSound`。然后,我们定义了两个派生类 `Dog` 和 `Cat`,它们分别重写了 `makeSound` 方法。在 `main` 函数中,我们创建了两个 `Animal` 类型的指针,分别指向 `Dog` 和 `Cat` 类的对象,并调用了它们的 `makeSound` 方法。由于 `makeSound` 是虚函数,因此实际调用的是派生类的 `makeSound` 方法,实现了多态。


http://www.kler.cn/a/393546.html

相关文章:

  • 鸿蒙next版开发:相机开发-适配不同折叠状态的摄像头变更(ArkTS)
  • C语言 | Leetcode C语言题解之第557题反转字符串中的单词III
  • 基于混合配准策略的多模态医学图像配准方法研究
  • python: postgreSQL using psycopg2 or psycopg
  • [代码随想录Day10打卡] 理论基础 232.用栈实现队列 225. 用队列实现栈 20. 有效的括号 1047. 删除字符串中的所有相邻重复项
  • 2024.11.12_大数据的诞生以及解决的问题
  • 「QT」几何数据类 之 QVector4D 四维向量类
  • 揭秘文心一言,智能助手新体验
  • Yolo11改进策略:上采样改进|CARAFE,轻量级上采样|即插即用|附改进方法+代码
  • 冒泡排序讲解
  • 【Linux取经之路】进程信号的保存
  • Python 正则表达式的一些介绍和使用方法说明(数字、字母和数字、电子邮件地址、网址、电话号码(简单)、IPv4 )
  • 报名开启|开放原子大赛“Rust数据结构与算法学习赛”
  • 吴恩达深度学习笔记(12)14
  • VBA高级应用30例应用3在Excel中的ListObject对象:插入行和列
  • 阿里云云效制品仓库(maven)私服配置快速入门
  • Linux软件包管理与Vim编辑器使用指南
  • 文件包含绕过(session打条件竞争应该是文件上传的!!!)
  • Python使用总结之如何去除图片的水印?
  • JavaScript入门笔记
  • SQL,力扣题目1107,每日新用户统计
  • Unity中实现战斗帧同步的高级技术
  • 网安加·百家讲坛 | 仝辉:金融机构鸿蒙应用安全合规建设方案
  • 重构代码之内联方法
  • 7、computed计算属性使用
  • 数据库参数备份