C++ 基础教程之虚函数实例代码详解

下面是针对“C++ 基础教程之虚函数实例代码详解”的完整攻略:

C++ 基础教程之虚函数实例代码详解

什么是虚函数?

在 C++ 中,虚函数是指在基类中声明为虚的函数,其在派生类中被重新定义的函数。使用虚函数可以实现运行时多态性,即在程序运行时根据对象的类型确定调用的方法。

在基类中使用虚函数时,需要将函数声明为“virtual”,并且函数的定义可以为纯虚函数,这样可以使基类成为抽象类,只定义接口而不实现具体功能。

例子 1:纯虚函数与基类的实现

#include<iostream>
using namespace std;

class Figure {
public:
    virtual double getArea() const = 0;
    virtual double getPerimeter() const = 0;
};

class Rectangle: public Figure {
public:
    Rectangle(double width, double height):_width(width),_height(height){}
    double getArea() const override {return _width * _height;}
    double getPerimeter() const override {return (_width + _height)*2;}
private:
    double _width;
    double _height;
};

class Circle: public Figure {
public:
    Circle(double radius):_radius(radius){}
    double getArea() const override {return 3.1415926 * _radius * _radius;}
    double getPerimeter() const override {return 2 * 3.1415926 * _radius;}
private:
    double _radius;
};

int main()
{
    Figure *pF=NULL;
    Rectangle rec(5,6);
    pF=&rec;
    cout << "Rectangle Area: " << pF->getArea() << endl;
    cout << "Rectangle Perimeter: " << pF->getPerimeter() << endl;

    Circle cir(4);
    pF=&cir;
    cout << "Circle Area: " << pF->getArea() << endl;
    cout << "Circle Perimeter: " << pF->getPerimeter() << endl;

    return 0;
}

在这个例子中,我们首先定义了一个抽象类 Figure,其中包含了两个纯虚函数 getArea() 和 getPerimeter(),这两个函数只是定义了接口而没有实现具体的代码,因此 Figure 是一个抽象类。然后分别定义一个 Rectangle 和 Circle 的类,这两个类都是由 Figure 派生而来的,并且实现了 getArea() 和 getPerimeter() 函数。最后在主函数中创建了 Rectangle 和 Circle 的实例,将变量 pF 指向不同类型的Figure实例,然后通过虚函数的多态性特性,调用各自类中的函数进行输出。

例子 2:虚函数与运行时多态

#include<iostream>
using namespace std;

class Animal {
public:
    virtual void speak() const { cout << "Animal speaks!" << endl; }
    virtual ~Animal(){}
};

class Cat : public Animal {
public:
    void speak() const override { cout << "Cat speaks: Meow!" << endl; }
};

class Dog : public Animal {
public:
    void speak() const override { cout << "Dog speaks: Bark!" << endl; }
};

int main()
{
    Animal *animalPtr = nullptr;

    Animal animal;
    Cat cat;
    Dog dog;

    animalPtr = &animal;
    animalPtr->speak();

    animalPtr = &cat;
    animalPtr->speak();

    animalPtr = &dog;
    animalPtr->speak();

    return 0;
}

在这个例子中,我们定义了一个 Animal 类,其中包含一个虚函数 speak(),然后派生出了 Cat 和 Dog 两个子类。接着我们在主函数中定义了一个指向 Animal 类的指针 animalPtr,将其分别指向三种不同类型的实例,并调用其各自的虚函数 speak()。这里利用了虚函数的多态性特质,使得对象根据指针所指向的具体类型调用不同类中的函数。输出的结果是:

Animal speaks!
Cat speaks: Meow!
Dog speaks: Bark!

以上就是“C++ 基础教程之虚函数实例代码详解”完整攻略,其中例子 1 展示了如何使用纯虚函数和抽象类,例子 2 展示了如何运用虚函数实现运行时多态。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ 基础教程之虚函数实例代码详解 - Python技术站

(0)
上一篇 2023年5月24日
下一篇 2023年5月24日

相关文章

  • 深入了解Java 脚本化api编程

    深入了解Java 脚本化API编程攻略 什么是Java 脚本化API Java 脚本化API是一组Java类和接口,它们使Java应用程序可以在运行时解释和运行脚本。该API提供了与脚本语言交互和制定脚本规则的功能,使Java程序具备动态性和灵活性。可以使用这个API来编写插件、脚本、宏或涉及领域专业语言的自定义工具。 Java 脚本化API的应用场景 Ja…

    C 2023年5月23日
    00
  • C++堆栈类模板实现代码

    C++中的堆栈类是一种常用的数据结构,可以实现后进先出(LIFO)的数据存储和处理方式。 下面是一个C++堆栈类模板的实现代码攻略,主要包括以下几个方面: 堆栈类模板的定义和实现 堆栈类模板由两个部分组成:头文件(.h文件)和源文件(.cpp文件)。 头文件中需要包含以下内容: 头文件保护宏定义,避免重复引用。 类定义,定义堆栈类模板及其成员函数。 类成员,…

    C 2023年5月24日
    00
  • C语言如何实现翻转字符串中的单词

    翻转字符串中的单词是C语言中常用的字符串操作之一,实现该功能的主要思路如下: 读入原字符串 按空格将字符串分割成单词数组 翻转单词数组 按照空格重新组合单词数组形成新的字符串 以下是实现该功能的完整代码: #include <stdio.h> #include <string.h> void reverseWords(char* s)…

    C 2023年5月23日
    00
  • C 程序 两个浮点数相乘

    首先,对于“C程序两个浮点数相乘”的完整使用攻略,我们需要了解一些基础知识。 在C语言中,我们可以使用float和double两种数据类型来表示浮点数。其中,float占用4个字节(32位),double占用8个字节(64位),所以在大多数情况下我们都会使用double类型来代表浮点数。 在C语言中,我们可以使用*运算符来实现两个浮点数相乘。具体使用方法请看…

    C 2023年5月9日
    00
  • 一般故障排除步骤与方法

    一般故障排除步骤与方法是指在出现问题时,根据既定的步骤和方法,对系统进行排查、诊断和修复。以下是一般故障排除步骤与方法的完整攻略: 1.确认问题 提供详细信息,例如发生时间、出现的错误提示信息、是否有日志记录等。 尝试重复问题并确定是否一致。 确定问题的严重程度和影响范围。 2.收集信息 查看系统文件(日志文件、配置文件等)以及系统状态(CPU、内存)。 确…

    C 2023年5月24日
    00
  • 基于Qt实现驾校科目考试系统的示例代码

    这里我将为您提供实现“基于Qt实现驾校科目考试系统”的完整攻略,以下是具体步骤: 步骤一:确定需求 首先需要确定项目的需求,对于“基于Qt实现驾校科目考试系统”这个项目,其需要实现的功能包括:学生登录、考试题目随机抽取、自动阅卷、成绩显示等。 步骤二:学习Qt基础知识 其次需要学习Qt基础知识,包括Qt的窗口、控件、布局管理器、信号槽机制等。推荐阅读Qt的官…

    C 2023年5月23日
    00
  • 拳皇97大门bug震的全人物整理

    拳皇97大门bug震的全人物整理攻略 什么是大门bug震? 在拳皇97中,存在一个被称为“大门bug”的漏洞。使用此漏洞可以通过特定按键组合让对手的活力值瞬间降为0,从而轻松获胜。而“大门bug震”则是一种利用此漏洞的特定攻击方式,使整个对手团队都受到震动效果,从而更容易实现胜利。 如何进行“大门bug震”? 要进行“大门bug震”,需要先使用一定的招数组合…

    C 2023年5月22日
    00
  • C++中Boost的转换函数

    Boost库是一个为C++编程语言提供了许多扩展和增强功能的库。其中Boost库中的转换函数以简单的方式支持数字、字符串、日期和时间之间的转换。此处介绍Boost库转换函数的相关知识和应用。 Boost库的转换函数 Boost库提供了一些方便的转换函数,这些转换函数能够涉及到数字、字符串和时间等类型之间的转换。以下为一些常见的转换函数: lexical_ca…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部