c++virtualvoidvsnovirtual

C++中virtual和非virtual函数的区别

在C++中,virtual和非virtual函数的区别在于是否支持多态。本文将详细讲解virtual和非virtual函数的区别,包括使用场景、实现方式、示例等内容。

virtual函数

在C++中,virtual函数是支持多态的。当一个类中的函数被声明为virtual时,可以被子类重写,从而实现多态。以下是一个使用virtual函数的示例:

#include <iostream>
using namespace std;

class Shape {
   public:
      virtual void draw() {
         cout << "Drawing Shape" << endl;
      }
};

class Circle: public Shape {
   public:
      void draw() {
         cout << "Drawing Circle" << endl;
      }
};

int main() {
   Shape *shape;
   Circle circle;
   shape = &circle;
   shape->draw();
   return 0;
}

在上面的示例中,首先定义了一个Shape类,其中的draw被声明为virtual。然后,定义了一个Circle类,它继承自Shape类重写了draw函数。在main函数中,创建了一个Circle对象,并将其赋值给一个Shape指针。最后,调用了Shape指针的draw函数,实现了多态。

非virtual函数

在C++中,非virtual函数是不支持多态的函数。当一个类中的函数被声明为virtual时,它不能被子类重写,从而无法实现多态。以下是一个使用非virtual函数的示例:

#include <iostream>
using namespace std;

class Shape {
   public:
      void draw() {
         cout << "Drawing Shape" << endl;
      }
};

class Circle: public Shape {
   public:
      void draw() {
         cout << "Drawing Circle" << endl;
      }
};

int main() {
   Shape *shape;
   Circle circle;
   shape = &circle;
   shape->draw();
   return 0;
}

在上面的示例中,定义了一个Shape类,其中的draw函数没有被声明为virtual。然后,定义了一个Circle类,它继承自Shape类,并重写了draw函数。在main函数中,创建了一个Circle对象,并将其赋值给一个Shape指针。最后,用了Shape指针的draw函数,于draw函数不是virtual函数,因此调用的是Shape类中draw函数,而是Circle类中的draw函数。

总结

本文详细讲解了C++中virtual和非virtual函数的区别,包括支持多态和不支持多态两种情况。通过本文的学习,读者可以解C++中何使用virtual函数实现多态。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++virtualvoidvsnovirtual - Python技术站

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

相关文章

  • R语言关于变量的知识点总结

    R语言关于变量的知识点总结 1. 变量的定义和赋值 在R语言中,可以使用赋值操作符<-或=来定义和赋值变量。变量名可以包含字母、数字和点号,但不能以数字开头。 示例: # 定义并赋值一个整数变量 x <- 10 # 定义并赋值一个字符变量 name <- \"John Doe\" 2. 变量的数据类型 R语言中的变量可以…

    other 2023年8月8日
    00
  • dataframe列运算

    Dataframe列运算 在数据处理中经常需要对Dataframe列进行运算,比如对列求和、求平均数等。Pandas提供了方便的方法来执行这些列运算,本文将介绍一些最常用的方法。 创建样本数据 在介绍具体方法之前,先创建一个样本数据,供我们演示使用。 import pandas as pd import numpy as np df = pd.DataFra…

    其他 2023年3月28日
    00
  • ActiveX部件不能创建对象:dm.dmsoft代码:800A01AD

    ActiveX部件不能创建对象:dm.dmsoft代码:800A01AD 解决方法 当在运行时遇到错误\”ActiveX部件不能创建对象:dm.dmsoft代码:800A01AD\”时,可能是由于以下原因导致的: 缺少所需的ActiveX组件:确保所需的ActiveX组件已正确安装在系统中。可以尝试重新安装或更新相关的组件。 缺少注册表项:检查注册表中是否存…

    other 2023年10月14日
    00
  • Spring为IOC容器注入Bean的五种方式详解

    Spring为IOC容器注入Bean的五种方式详解 1. 构造器注入 构造器注入是通过调用对象的构造函数来实现依赖注入。在Spring中,我们可以使用构造器注入来创建一个Bean,并将依赖的其他Bean通过构造函数的参数传递进来。 以下是一个示例: public class CustomerService { private CustomerReposito…

    other 2023年6月28日
    00
  • Vue2.x通用编辑组件的封装及应用详解

    下面我将详细讲解“Vue2.x通用编辑组件的封装及应用详解”的完整攻略。 标题 “Vue2.x通用编辑组件的封装及应用详解” 前言 在Vue开发中,我们经常需要进行表单编辑,并且需要考虑到表单校验、数据双向绑定等问题。为了提高开发效率和代码复用率,我们可以封装一个通用的编辑组件。本文将详细讲解如何封装和应用这样一个通用组件。 正文 1. 组件封装 1.1 概…

    other 2023年6月25日
    00
  • vue3升级常见问题详细汇总

    Vue3升级常见问题详细汇总 Vue3作为一个全新的版本,对于Vue2用户来说需要注意一些变化和更新。本文将为大家汇总Vue3升级过程中的常见问题,并介绍一些常见的解决方案。 问题1: 修改了”v-model”指令 在Vue2中,”v-model”指令可以用于双向绑定数据。但在Vue3中,”v-model”指令的用法发生了修改。如下所示: <!– V…

    other 2023年6月27日
    00
  • linux rsync安装 配置 实例详解

    Linux Rsync安装 配置 完整攻略 Rsync(Remote Sync)能够让你的文件同步工作变得更简单,是一个高效的数据同步工具。本文将介绍Linux系统中Rsync的安装和配置方法。 1. 安装Rsync Rsync在大多数Linux发行版中都已经预装,如果没有安装,则可以通过以下命令来安装rsync: # Debian/Ubuntu sudo …

    other 2023年6月25日
    00
  • velocity模板引擎学习(2)-velocitytools2.0

    以下是详细讲解“velocity模板引擎学习(2)-velocitytools2.0的完整攻略,过程中至少包含两条示例说明”的标准Markdown格式文本: Velocity模板引擎学习(2) – VelocityTools 2.0 VelocityTools是一个为Velocity模板引擎提供扩展功能的工具集。它包含了一些常用的工具,如日期格式化、数字格式…

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