C++中的封装,继承和多态

目录

摘要

封装(Encapsulation)

基础用法

继承(Inheritance)

基础用法

多态(Polymorphism)

[1. 虚函数](#1. 虚函数)

[2. 纯虚函数](#2. 纯虚函数)

总结


摘要

在C++中,封装、继承和多态是面向对象编程的三大核心特性。为了方便大家理解,下面我将举一些例子来简单说明一下。

封装(Encapsulation)

封装是将数据和操作数据的方法捆绑在一起,并隐藏对象的内部实现细节,只暴露必要的接口给外部使用。C++通过类和访问修饰符(publicprotectedprivate)来实现封装。

基础用法

cpp 复制代码
#include <iostream>
#include <string>

class Food {
private:
    std::string name;  // 食品名称
    double calories;   // 卡路里含量

public:
    // 构造函数
    Food(const std::string& foodName, double foodCalories)
        : name(foodName), calories(foodCalories) {}

    // 设置食品名称的方法
    void setName(const std::string& foodName) {
        name = foodName;
    }

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

    // 设置卡路里含量的方法
    void setCalories(double foodCalories) {
        calories = foodCalories;
    }

    // 获取卡路里含量的方法
    double getCalories() const {
        return calories;
    }
};

int main() {
    Food apple("Apple", 52);  // 创建食品对象
    std::cout << "Food: " << apple.getName() << ", Calories: " << apple.getCalories() << std::endl;

    apple.setName("Green Apple");
    apple.setCalories(48);
    std::cout << "Food: " << apple.getName() << ", Calories: " << apple.getCalories() << std::endl;

    return 0;
}

继承(Inheritance)

继承允许一个类(子类)从另一个类(父类)继承数据成员和成员函数,从而实现代码复用。C++支持单继承和多继承。

基础用法

cpp 复制代码
#include <iostream>
#include <string>

// 基类 Food
class Food {
protected:
    std::string name;
    double calories;

public:
    // 构造函数
    Food(const std::string& foodName, double foodCalories)
        : name(foodName), calories(foodCalories) {}

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

    // 获取卡路里含量的方法
    double getCalories() const {
        return calories;
    }
};

// 派生类 Fruit 继承自 Food
class Fruit : public Food {
public:
    // 构造函数
    Fruit(const std::string& fruitName, double fruitCalories)
        : Food(fruitName, fruitCalories) {}

    // 显示水果信息的方法
    void displayInfo() const {
        std::cout << "Fruit: " << name << ", Calories: " << calories << " kcal" << std::endl;
    }
};

// 派生类 Vegetable 继承自 Food
class Vegetable : public Food {
public:
    // 构造函数
    Vegetable(const std::string& vegetableName, double vegetableCalories)
        : Food(vegetableName, vegetableCalories) {}

    // 显示蔬菜信息的方法
    void displayInfo() const {
        std::cout << "Vegetable: " << name << ", Calories: " << calories << " kcal" << std::endl;
    }
};

int main() {
    Fruit apple("Apple", 52);  // 创建水果对象
    Vegetable carrot("Carrot", 41);  // 创建蔬菜对象

    apple.displayInfo();  // 显示水果信息
    carrot.displayInfo();  // 显示蔬菜信息

    return 0;
}

多态(Polymorphism)

多态允许使用基类的指针或引用来调用子类的重写方法,实际调用的方法在运行时决定。C++中的多态性通过虚函数实现。

1. 虚函数

cpp 复制代码
#include <iostream>
#include <string>

// 基类 Food
class Food {
public:
    // 虚函数 displayInfo
    virtual void displayInfo() const {
        std::cout << "This is a food item." << std::endl;
    }
};

// 派生类 Fruit 继承自 Food
class Fruit : public Food {
private:
    std::string name;
    double calories;

public:
    // 构造函数
    Fruit(const std::string& fruitName, double fruitCalories)
        : name(fruitName), calories(fruitCalories) {}

    // 重写 displayInfo 方法
    void displayInfo() const override {
        std::cout << "Fruit: " << name << ", Calories: " << calories << " kcal" << std::endl;
    }
};

// 派生类 Vegetable 继承自 Food
class Vegetable : public Food {
private:
    std::string name;
    double calories;

public:
    // 构造函数
    Vegetable(const std::string& vegetableName, double vegetableCalories)
        : name(vegetableName), calories(vegetableCalories) {}

    // 重写 displayInfo 方法
    void displayInfo() const override {
        std::cout << "Vegetable: " << name << ", Calories: " << calories << " kcal" << std::endl;
    }
};

int main() {
    Food* food;
    Fruit apple("Apple", 52);
    Vegetable carrot("Carrot", 41);

    food = &apple;
    food->displayInfo();  // 将调用 Fruit 的 displayInfo 方法

    food = &carrot;
    food->displayInfo();  // 将调用 Vegetable 的 displayInfo 方法

    return 0;
}

2. 纯虚函数

cpp 复制代码
#include <iostream>
#include <string>

// 抽象基类 Drink
class Drink {
public:
    // 纯虚函数 displayInfo
    virtual void displayInfo() const = 0;  // 定义接口,但没有实现
};

// 派生类 Juice 继承自 Drink
class Juice : public Drink {
private:
    std::string name;
    double volume;

public:
    // 构造函数
    Juice(const std::string& juiceName, double juiceVolume)
        : name(juiceName), volume(juiceVolume) {}

    // 实现纯虚函数 displayInfo
    void displayInfo() const override {
        std::cout << "Juice: " << name << ", Volume: " << volume << " ml" << std::endl;
    }
};

// 派生类 Soda 继承自 Drink
class Soda : public Drink {
private:
    std::string name;
    double volume;

public:
    // 构造函数
    Soda(const std::string& sodaName, double sodaVolume)
        : name(sodaName), volume(sodaVolume) {}

    // 实现纯虚函数 displayInfo
    void displayInfo() const override {
        std::cout << "Soda: " << name << ", Volume: " << volume << " ml" << std::endl;
    }
};

int main() {
    Juice orangeJuice("Orange Juice", 250);
    Soda cola("Cola", 330);

    // 创建 Drink 类型的指针数组
    Drink* drinks[2];
    drinks[0] = &orangeJuice;
    drinks[1] = &cola;

    // 遍历数组并调用 displayInfo 方法
    for (int i = 0; i < 2; ++i) {
        drinks[i]->displayInfo();  // 将调用具体对象的 displayInfo 方法
    }

    return 0;
}

总结

  1. 封装:通过类和访问控制符(publicprotectedprivate )实现数据隐藏和接口统一。

  2. 继承:允许一个类继承另一个类的属性和方法,促进代码复用。

  3. 多态:允许基类指针或引用调用子类的重写方法,实际调用的方法在运行时确定。

相关推荐
浪裡遊25 分钟前
React Hooks全面解析:从基础到高级的实用指南
开发语言·前端·javascript·react.js·node.js·ecmascript·php
好好研究29 分钟前
学习栈和队列的插入和删除操作
数据结构·学习
彭祥.1 小时前
Jetson边缘计算主板:Ubuntu 环境配置 CUDA 与 cudNN 推理环境 + OpenCV 与 C++ 进行目标分类
c++·opencv·分类
lzb_kkk1 小时前
【C++】C++四种类型转换操作符详解
开发语言·c++·windows·1024程序员节
YuTaoShao1 小时前
【LeetCode 热题 100】48. 旋转图像——转置+水平翻转
java·算法·leetcode·职场和发展
好开心啊没烦恼1 小时前
Python 数据分析:numpy,说人话,说说数组维度。听故事学知识点怎么这么容易?
开发语言·人工智能·python·数据挖掘·数据分析·numpy
生态遥感监测笔记2 小时前
GEE利用已有土地利用数据选取样本点并进行分类
人工智能·算法·机器学习·分类·数据挖掘
简佐义的博客2 小时前
破解非模式物种GO/KEGG注释难题
开发语言·数据库·后端·oracle·golang
Tony沈哲2 小时前
macOS 上为 Compose Desktop 构建跨架构图像处理 dylib:OpenCV + libraw + libheif 实践指南
opencv·算法