首页 > 编程语言 >c++学习:封装继承多态

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

时间:2024-11-09 12:46:47浏览次数:5  
标签:封装 继承 子类 代码 多态 c++ Animal

目录

封装

封装的定义

封装的好处

封装的实例

继承

继承的定义

继承的好处

继承的实例

多态

多态的定义

多态的好处

多态的实例


封装

封装的定义

封装是面向对象编程(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` 方法,实现了多态。

标签:封装,继承,子类,代码,多态,c++,Animal
From: https://blog.csdn.net/weixin_73861555/article/details/143643252

相关文章

  • 多态(c++)
    一、概念多态分为编译时多态(静态多态)和运行时多态(动态多态),函数重载和函数模板就是编译时多态,它们传不同的类型的参数就可以调用不同的函数,通过参数不同达到多种形态,因为它们实参传给形参的参数匹配是在编译时完成的,所以叫编译时多态运行时多态,在完成某个行为(函数),可以传不同......
  • 二叉树常用代码合集【C++版】(详细注释)
    二叉树常用代码合集【C++版】(详细注释)关键的地方有详细的注释。如果需要更详细的注释,可以丢给大模型再注释一遍。#include<iostream>#include<memory>#include<string>#definemv(x)std::move(x)#definecoutln(x)cout<<x<<endlusingnamespacestd;......
  • C++算法练习-day38——106.从中序和后序遍历序列构造二叉树
    题目来源:.-力扣(LeetCode)题目思路分析题目要求根据一棵二叉树的中序遍历(inorder)和后序遍历(postorder)结果重建这棵二叉树。中序遍历的特点是左子树->根节点->右子树,而后序遍历的特点是左子树->右子树->根节点。利用这两个遍历的特点,我们可以递归地重建整棵树。后序......
  • 基于eBPF实现vxlan封装和解封装
    不同于cilium基于Linux内核完成vxlan封装和解封装的逻辑,这里基于eBPF自己完成vxlan封装和解封装,不走Linux内核vxlan模块。tc_ingress和tc_egress加载到主机veth口和主机网口ens33上。eBPF封装vxlan:通过bpf_skb_adjust_room函数,增加ip头+udp头+vxlan头+以太网头。打通跨节点流......
  • RT DETR v2 TensorRT C++ 部署详解
    RT-DETRv2TensorRTC++部署详解概述随着深度学习技术的发展,目标检测算法在各种应用场景下展现出了卓越的表现。RT-DETRv2(Real-TimeDetectionTransformerv2)作为一款高效的实时目标检测模型,其结合了Transformer架构的优势与传统卷积神经网络(CNNs)的速度,为开发者提供了在......
  • 利用 C++ 开发经典 2D (超级马里奥)平台游戏(代码可用~)
    ......
  • 【华为OD技术面试手撕真题】82、环形链表II | 手撕真题+思路参考+代码解析(C & C++ & J
    文章目录一、题目......
  • 大整数相加[C++]
    0前言当我们遇到需要处理非常大的整数的情况时,标准的数据类型如int或longlongint可能无法满足需求,因为这些类型的数值范围有限。在这种情况下,我们需要一种方法来处理超出常规数据类型范围的大整数。本文将介绍如何使用C++实现大整数相加。1大整数相加的基本原理从最低位开......
  • JAVA (继承+多态)创建一个父类Monster
    题目描述  (继承+多态)创建一个父类Monster,父类带有一个boolean返回值的方法frighten,用于打印输出"arrrgh";创建一个继承于Monster父类的子类Dragon,重写frighten方法,用于打印输出"breathfire";创建一个继承于Monster父类的子类Vampire,重写frighten方法,用于打印输出"a......
  • C++函数名后面有个const
    ‌函数名后面加const表示该函数是一个常成员函数,即该函数不会修改类的任何成员变量。‌在C++中,常成员函数通过在函数声明和定义后添加const关键字来标识。常成员函数不能修改类的任何成员变量,这保证了类的接口的稳定性。例如: classPoint{public:intGetX()const;//......