55利用虚函数实现动态多样性

简介: 55利用虚函数实现动态多样性

C++入门——60s从0到1

利用虚函数实现动态多样性

 

动态多样性是指在运行时根据对象的实际类型调用相应的方法。在C++中,利用虚函数可以实现动态多样性。

 

虚函数是一种特殊的成员函数,它可以被派生类重写。在基类中声明一个虚函数,并在派生类中重新定义这个函数时,可以使用关键字`override`。当使用基类指针或引用调用虚函数时,实际上会调用派生类中的函数。

 

下面是一个简单的示例代码,演示了如何使用虚函数实现动态多样性:

 

#include <iostream>
using namespace std;
 
// 基类 Shape
class Shape {
public:
    virtual double area() = 0; // 纯虚函数
};
 
// 派生类 Rectangle
class Rectangle: public Shape {
public:
    double width;
    double height;
    Rectangle(double w, double h): width(w), height(h) {}
    double area() override { return width * height; } // 重写虚函数
};
 
// 派生类 Circle
class Circle: public Shape {
public:
    double radius;
    Circle(double r): radius(r) {}
    double area() override { return 3.14 * radius * radius; } // 重写虚函数
};
 
int main() {
    Shape* shape1 = new Rectangle(5, 6);
    Shape* shape2 = new Circle(3);
    cout << "The area of rectangle is " << shape1->area() << endl;
    cout << "The area of circle is " << shape2->area() << endl;
    delete shape1;
    delete shape2;
    return 0;
}

在上面的代码中,我们定义了一个抽象基类`Shape`,它包含一个纯虚函数`area()`。然后我们定义了两个派生类`Rectangle`和`Circle`,它们都重写了`Shape`中的虚函数`area()`。在`main()`函数中,我们创建了一个`Shape`类型的指针,并将其分别指向一个`Rectangle`对象和一个`Circle`对象。然后我们调用了它们的`area()`方法,输出了它们的面积。由于这两个对象都是`Shape`类型的,所以我们可以在不知道它们具体类型的前提下调用它们的`area()`方法。这就是动态多样性的实现方式之一。通过这种方式,我们可以编写更加灵活和可扩展的代码。

目录
相关文章
|
4天前
|
设计模式 编解码 算法
【C/C++ 虚函数以及替代方案】C++ 虚函数的使用开销以及替代方案(三)
【C/C++ 虚函数以及替代方案】C++ 虚函数的使用开销以及替代方案
45 0
|
4天前
|
存储 设计模式 编译器
【C/C++ 虚函数以及替代方案】C++ 虚函数的使用开销以及替代方案(一)
【C/C++ 虚函数以及替代方案】C++ 虚函数的使用开销以及替代方案
74 0
|
4天前
|
设计模式 安全 算法
【C++ 基础】超越边界:C++中真正不受访问修饰符限制的特性
【C++ 基础】超越边界:C++中真正不受访问修饰符限制的特性
37 0
|
4天前
|
存储 JSON 安全
【C++ 泛型编程 综合篇】泛型编程深度解析:C++中的五种类型泛型策略综合对比
【C++ 泛型编程 综合篇】泛型编程深度解析:C++中的五种类型泛型策略综合对比
66 1
|
4天前
|
设计模式 编译器 数据安全/隐私保护
C++ 多级继承与多重继承:代码组织与灵活性的平衡
C++的多级和多重继承允许类从多个基类继承,促进代码重用和组织。优点包括代码效率和灵活性,但复杂性、菱形继承问题(导致命名冲突和歧义)以及对基类修改的脆弱性是潜在缺点。建议使用接口继承或组合来避免菱形继承。访问控制规则遵循公有、私有和受保护继承的原则。在使用这些继承形式时,需谨慎权衡优缺点。
25 1
|
4天前
|
算法 搜索推荐 编译器
【C/C++ 编程题 04】实现 模板函数和模板类的特例化,并且展示差异化的点
【C/C++ 编程题 04】实现 模板函数和模板类的特例化,并且展示差异化的点
29 0
|
4天前
|
存储 编译器 程序员
【C/C++ 虚函数以及替代方案】C++ 虚函数的使用开销以及替代方案(二)
【C/C++ 虚函数以及替代方案】C++ 虚函数的使用开销以及替代方案
67 0
|
4天前
|
Java 编译器 C#
【C++ 继承的多样性】C++ 多继承与虚拟继承:探究核心原理与应用实践
【C++ 继承的多样性】C++ 多继承与虚拟继承:探究核心原理与应用实践
44 1
|
4天前
|
开发框架 安全 编译器
【C/C++ 深入探讨构函数】C++ 编译器在什么情况下无法生成默认的析构函数?
【C/C++ 深入探讨构函数】C++ 编译器在什么情况下无法生成默认的析构函数?
55 1
|
8月前
|
存储 编译器 C++
c++ 有趣的动态转换之 delete 崩溃探究兼谈基类虚析构的重要性
c++ 有趣的动态转换之 delete 崩溃探究兼谈基类虚析构的重要性