c++virtualvoidvsnovirtual

yizhihongxing

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日

相关文章

  • Java面试常问计算机网络问题小结

    Java面试常问计算机网络问题小结 1. 计算机网络基础知识 1.1 IP协议 IP协议是什么? 答:IP协议是Internet Protocol的缩写,是一种网络层协议,负责将数据包从一个节点传输到另一个节点。 IP地址和MAC地址的区别? 答:IP地址是逻辑地址,用于在Internet上识别一个节点,而MAC地址是物理地址,用于在局域网上识别一个节点。 …

    other 2023年6月27日
    00
  • React.js入门学习第一篇

    下面为大家详细讲解“React.js入门学习第一篇”的完整攻略。 简介 React.js是Facebook出品的一款用于构建用户界面的JavaScript库。其特别之处在于采用组件化方式构建用户界面,将整个应用程序拆分为多个组件,进行单独开发、测试和维护,有利于提高代码的模块化程度、可维护性和重用性。 前置知识 在学习React.js之前,需要掌握以下的技能…

    other 2023年6月27日
    00
  • intellij idea全局查找和替换的具体使用

    IntelliJ IDEA全局查找和替换的具体使用攻略 IntelliJ IDEA是一款功能强大的集成开发环境(IDE),提供了全局查找和替换功能,可以帮助开发者快速定位和替换代码中的特定内容。下面是使用IntelliJ IDEA全局查找和替换的详细步骤和示例说明。 步骤1:打开全局查找和替换窗口 在IntelliJ IDEA中,你可以通过以下步骤打开全局查…

    other 2023年8月19日
    00
  • 多表关联同时更新多条不同的记录方法分享

    很抱歉,作为文本模型,我无法以标准的markdown格式回答您的问题。但是,我可以为您提供一份详细的攻略,包含多表关联同时更新多条不同的记录的方法和示例说明。请注意,以下内容将以纯文本形式呈现。 多表关联同时更新多条不同的记录方法分享 方法一:使用子查询 可以使用子查询来实现多表关联同时更新多条不同的记录。以下是一个示例: UPDATE table1 SET…

    other 2023年10月17日
    00
  • 前端架构vue架构插槽slot使用教程

    前端架构Vue架构插槽(Slot)使用教程 什么是插槽(Slot)? 在Vue.js中,插槽(Slot)是一种用于在组件中插入内容的机制。它允许我们在组件的模板中定义一些占位符,然后在使用该组件时,将具体的内容插入到这些占位符中。 插槽的基本用法 在Vue中,我们可以通过以下步骤来使用插槽: 在组件的模板中定义插槽。可以使用<slot>标签来定义…

    other 2023年8月20日
    00
  • s3clientaws

    以下是关于“s3clientaws”的完整攻略: 什么是s3clientaws s3clientaws是一个用于访问Amazon S3服务的AWS SDK for JavaScript的客户端。它提供了一组API,可以让开发者在中方便地访问Amazon S3服务,包括上传、下载、删除、复制等操作。 s3clientaws的安装和配置 可以通过npm安装s3c…

    other 2023年5月7日
    00
  • C语言编程函数指针入门精讲教程

    首先,需要明确函数指针的概念:函数指针是指向函数的指针变量。通过函数指针,我们可以将函数名作为一个参数传递给另一个函数,或者在一个函数中返回一个函数名,从而实现函数的动态调用。 接下来,我们可以按照以下步骤进行函数指针的使用: 1. 声明函数指针类型 在使用函数指针之前,我们需要先定义函数指针类型。函数指针类型的定义方式为:指针类型名 (*函数指针名)(参数…

    other 2023年6月27日
    00
  • Android开发实现自动切换文字TextSwitcher功能示例

    Android开发实现自动切换文字TextSwitcher功能示例攻略 简介 TextSwitcher是Android中的一个视图控件,用于在同一个位置自动切换显示不同的文本。它通常用于实现轮播文字、广告标语等功能。本攻略将详细介绍如何在Android开发中实现自动切换文字的TextSwitcher功能。 步骤 步骤一:添加TextSwitcher到布局文件…

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