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日

相关文章

  • C语言课程设计之抽奖系统

    C语言课程设计之抽奖系统 系统简介 本系统是一个基于C语言的抽奖系统,主要用于生成指定数量的随机码,并且可以根据指定条件进行抽奖。 系统需求 在终端中实现以下功能: 生成指定数量的随机码 按照指定条件抽取随机码 系统设计 随机码生成 由于随机码的生成是本系统的重点之一,因此我们需要用到C语言中的伪随机数生成函数rand(),并且在使用rand()函数之前,需…

    C 2023年5月23日
    00
  • =(赋值)和==(等于)运算符的区别

    =(赋值)和==(等于)运算符是程序中经常使用的两种运算符,但它们的功能和使用方式是完全不同的。 首先,=(赋值)运算符用于将一个值赋给一个变量,表示将右侧的值存储到左侧的变量名所代表的内存空间中。例如: x = 10 这条语句的意思是将数字10赋值给变量x,即在内存中创建一个名为x的变量,并将10存储到该变量所代表的内存空间中。 而==(等于)运算符则用于…

    C 2023年5月10日
    00
  • C语言实现520表白代码 祝你表白成功!

    C语言实现520表白代码攻略 感谢您对C语言表白代码的关注。下面是实现520表白代码的完整攻略。 1. 准备工作 在开始实现520表白代码之前,需要安装C语言编译器。在Windows系统上,我们建议使用MinGW或者Visual Studio Code(带有C/C++扩展)作为编译器;在Linux系统上,可以使用GCC。 2. 编写C程序 我们可以通过在C程…

    C 2023年5月23日
    00
  • C语言实现小型电子词典

    C语言实现小型电子词典攻略 项目概述 这是一个使用C语言实现的小型电子词典,它可以通过命令行窗口输入单词并查询其对应的中文翻译。本词典基于哈希表实现。哈希表是一种数据结构,可以快速地进行查询和插入操作,因此非常适合用于实现词典这样的查询应用。 实现步骤 1. 读取词典文件 首先需要从词典文件中读取单词和对应的中文翻译,这里推荐使用标准数据格式JSON来存储词…

    C 2023年5月23日
    00
  • 一篇文章带你了解C++多态的实现原理

    一篇文章带你了解C++多态的实现原理 概述 多态是面向对象编程中的一个重要概念,它使不同类型的对象对同一消息作出响应。C++支持多态,实现方式包括虚函数和函数指针等。本文主要讲解C++多态的实现原理和使用方法。 代码示例 我们通过一个简单的代码示例来演示多态的实现。 案例描述 假设有一个基类Animal,有两个派生类Dog和Cat,它们都实现了一个虚函数ma…

    C 2023年5月22日
    00
  • C/C++程序编译流程详解

    下面是对于“C/C++程序编译流程详解”的完整攻略: 概述 程序编译是将程序源代码转换为计算机可识别的机器码的过程。在C/C++语言中,程序编译分为四个主要阶段: 预处理(Preprocessing):处理以“#”开头的预处理指令; 编译(Compilation):将预处理后的文件转换为汇编文件; 汇编(Assembly):将汇编文件转换为机器码文件; 链接…

    C 2023年5月23日
    00
  • 关于Fragment already added问题的解决方案

    关于 Fragment already added 问题的解决方案一般有以下几种: 方案一:使用findFragmentByTag 在Activity中使用FragmentManager的findFragmentByTag()方法来查找Fragment是否已经被添加。如果已经添加,则不需要重复添加,避免出现Fragment already added异常。 …

    C 2023年5月23日
    00
  • C++中新手容易犯的十种编程错误汇总

    C++中新手容易犯的十种编程错误汇总 作为一种流行的编程语言,C++在实际应用中被广泛使用,然而,对于初学者来说,C++的语法结构、编程范式以及一些细节问题容易让他们犯错。 下面列出了C++中新手容易犯的十种编程错误并提供了攻略,供初学者参考: 1. 没有包含必要的头文件 C++中有大量的头文件,而这些头文件中定义了许多有用的函数和变量。如果没有包含必要的头…

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