首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

C++ Practical-1 day6

  • 25-02-19 07:40
  • 4518
  • 9861
blog.csdn.net

系列文章目录

点击直达——文章总目录


文章目录

  • 系列文章目录
  • C++ Practical-1 day6
    • Overview
    • 1.abstract_class 抽象类
      • 1.1.抽象类的特点
      • 1.2.示例:抽象类
      • 1.3.注意事项
    • 2.virtual_function 虚函数
      • 2.1.示例:动物叫声的多态性
      • 2.2.示例:计算图形的面积
      • 2.3.注意事项
    • 关于作者


C++ Practical-1 day6

Overview

  • C++不练习coding,就相当于空中楼阁,基础不扎实
  • 光吃不干,等于没吃

1.abstract_class 抽象类

在C++中,抽象类是一种不能被实例化的类,它通常作为基类使用,用于定义一个接口或规范,确保派生类遵循某些方法。抽象类通过包含至少一个纯虚函数(pure virtual function)来实现。

1.1.抽象类的特点

  1. 纯虚函数:抽象类至少包含一个纯虚函数。纯虚函数没有实现,使用= 0声明。

  2. 不能被实例化:由于抽象类不提供完整的实现,因此不能创建其实例。

  3. 派生类必须覆盖所有纯虚函数:派生类必须覆盖基类中的所有纯虚函数,除非派生类也是抽象类。

  4. 虚析构函数:通常在抽象类中定义虚析构函数,以确保删除派生类对象时正确调用派生类的析构函数。

1.2.示例:抽象类

#include 
#include 

// 抽象类
class Shape {
public:
    // 纯虚函数
    virtual void draw() const = 0;

    // 虚析构函数
    virtual ~Shape() {}
};

// 派生类
class Circle : public Shape {
public:
    void draw() const override {
        std::cout << "Drawing a circle." << std::endl;
    }
};

// 另一个派生类
class Rectangle : public Shape {
public:
    void draw() const override {
        std::cout << "Drawing a rectangle." << std::endl;
    }
};

int main() {
    // 使用基类指针指向派生类对象
    std::unique_ptr<Shape> shape1(new Circle());
    std::unique_ptr<Shape> shape2(new Rectangle());

    shape1->draw(); // 调用Circle的draw函数
    shape2->draw(); // 调用Rectangle的draw函数

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

在这个例子中,Shape是一个抽象类,它包含一个纯虚函数draw。Circle和Rectangle是派生自Shape的类,它们都覆盖了draw函数。在main函数中,我们使用Shape指针来指向Circle和Rectangle对象,并调用它们的draw函数。

1.3.注意事项

  1. 接口定义:抽象类通常用于定义接口,它规定了派生类必须实现的函数。

  2. 多态:抽象类通常与多态一起使用,允许通过基类指针或引用来调用派生类中覆盖的虚函数。

  3. 抽象类和虚函数:抽象类可以包含多个纯虚函数和普通虚函数。普通虚函数提供了默认实现,而纯虚函数没有。

  4. 抽象类和继承:派生类可以从多个抽象类继承,也可以是另一个抽象类的抽象类。

  5. 抽象类的实现:虽然抽象类不能被实例化,但它们可以包含成员函数的实现,这些实现可以被派生类继承。

  6. 工厂模式:抽象类经常与工厂模式结合使用,用于创建一系列相关对象。

抽象类是C++中实现面向对象设计原则的重要工具,它有助于定义清晰的接口和促进代码的模块化。

2.virtual_function 虚函数

在C++中,虚函数用于实现多态性,允许通过基类指针或引用调用派生类中覆盖的函数。以下是一个使用虚函数的编程实例:

2.1.示例:动物叫声的多态性

#include 

// 基类
class Animal {
public:
    virtual void speak() const {
        std::cout << "The animal makes a sound." << std::endl;
    }

    virtual ~Animal() {} // 虚析构函数
};

// 派生类:狗
class Dog : public Animal {
public:
    void speak() const override {
        std::cout << "The dog barks." << std::endl;
    }
};

// 派生类:猫
class Cat : public Animal {
public:
    void speak() const override {
        std::cout << "The cat meows." << std::endl;
    }
};

int main() {
    Animal* myAnimal = nullptr;

    Dog myDog;
    myAnimal = &myDog;
    myAnimal->speak(); // 输出: The dog barks.

    Cat myCat;
    myAnimal = &myCat;
    myAnimal->speak(); // 输出: The cat meows.

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

在这个例子中,Animal是一个基类,它有一个虚函数speak。Dog和Cat是派生自Animal的类,它们都覆盖了speak函数。在main函数中,我们使用Animal指针myAnimal来指向Dog和Cat对象,并调用它们的speak函数。

2.2.示例:计算图形的面积

#include 

// 基类:形状
class Shape {
public:
    virtual double area() const = 0; // 纯虚函数
    virtual ~Shape() {} // 虚析构函数
};

// 派生类:圆形
class Circle : public Shape {
private:
    double radius;
public:
    Circle(double r) : radius(r) {}

    double area() const override {
        return 3.14159 * radius * radius;
    }
};

// 派生类:矩形
class Rectangle : public Shape {
private:
    double width, height;
public:
    Rectangle(double w, double h) : width(w), height(h) {}

    double area() const override {
        return width * height;
    }
};

int main() {
    const double pi = 3.14159;
    Shape* shape;

    Circle circle(5); // 半径为5的圆
    shape = &circle;
    std::cout << "Circle area: " << shape->area() << std::endl; // 输出圆形的面积

    Rectangle rectangle(4, 6); // 宽4高6的矩形
    shape = &rectangle;
    std::cout << "Rectangle area: " << shape->area() << std::endl; // 输出矩形的面积

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

在这个例子中,Shape是一个抽象基类,它有一个纯虚函数area。Circle和Rectangle是派生自Shape的类,它们都覆盖了area函数。在main函数中,我们使用Shape指针shape来指向Circle和Rectangle对象,并调用它们的area函数。

2.3.注意事项

  1. 多态性:虚函数允许多态性,使得可以通过基类指针或引用来调用派生类中覆盖的函数。

  2. 抽象基类:包含纯虚函数的类是抽象基类,不能被实例化。

  3. 派生类覆盖虚函数:派生类可以使用override关键字来覆盖基类的虚函数。

  4. 虚析构函数:在基类中声明虚析构函数,以确保删除派生类对象时正确调用派生类的析构函数。

  5. 动态类型识别:可以使用dynamic_cast在运行时安全地将基类指针或引用转换为派生类指针或引用。

虚函数是C++中实现多态性的关键,使得代码更加灵活和可扩展。


关于作者

  • 微信公众号:WeSiGJ
  • GitHub:https://github.com/wesigj/cplusplusboys
  • CSDN:https://blog.csdn.net/wesigj
  • 微博:
  • -版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
WeSiGJ
微信公众号
共同分享,共同交流, 共同学习!
注:本文转载自blog.csdn.net的WeSiGJ的文章"https://blog.csdn.net/wesigj/article/details/142499669"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2491) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top