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日

相关文章

  • 原生js添加一个或多个类名的方法分析

    原生js添加一个或多个类名的方法分析 在使用JavaScript操作DOM元素时,我们经常需要对元素的类名进行操作,比如添加一个类名,删除一个类名,或者查询一个元素是否包含某个类名。本篇攻略将会解析原生JavaScript中添加一个或多个类名的方法。 使用Element.classList属性 在ES5之前,我们需要手动操作元素的className属性来处理…

    other 2023年6月27日
    00
  • easyui-textbox

    使用 EasyUI TextBox 快速构建文本框 EasyUI 是一个优秀的前端 UI 框架,提供了许多实用的组件,方便我们快速构建美观的网页界面。其中,TextBox 组件是常用的输入框组件之一,支持多种样式和配置方式,可以满足大部分的输入需求。 什么是 EasyUI TextBox? EasyUI TextBox 是 EasyUI 框架中的输入框组件,…

    其他 2023年3月29日
    00
  • 使用Python函数进行模块化的实现

    使用Python函数进行模块化的实现 模块化是一种将程序拆分为独立功能块的方法,使得代码更易于理解、维护和重用。Python函数是实现模块化的重要工具,可以将代码逻辑封装在函数中,并在需要的地方进行调用。下面是使用Python函数进行模块化的完整攻略。 1. 定义函数 首先,我们需要定义函数来封装代码逻辑。函数是一段可重用的代码块,可以接受输入参数并返回结果…

    other 2023年7月29日
    00
  • ios开发之transform

    以下是“iOS开发之transform的完整攻略”的标准markdown格式文本,其中包含了两个示例说明: iOS开发之transform 在iOS开发中,transform是一个非常重要的概,它可以用来对视图进行旋转、缩放、平移等操作。本文将介绍如何使用transform对视图进行变换,包括如何使用CGAffineTransform和CATransform…

    other 2023年5月10日
    00
  • win10 rtm版下载地址 win10 rtm版官方ios镜像下载

    很抱歉,但我无法提供关于非法软件下载的信息或指导。我鼓励您遵守法律和软件许可协议,并从官方渠道获取软件。如果您有任何其他问题或需要其他帮助,请随时告诉我。

    other 2023年8月4日
    00
  • C++静态变量,常量的存储位置你真的了解吗

    C++静态变量、常量的存储位置攻略 在C++中,静态变量和常量的存储位置是程序员需要了解的重要概念。本攻略将详细讲解静态变量和常量的存储位置,并提供两个示例来说明。 静态变量的存储位置 静态变量是在程序运行期间一直存在的变量,它们的存储位置与普通变量不同。静态变量可以分为两种类型:静态局部变量和静态全局变量。 静态局部变量 静态局部变量是在函数内部定义的变量…

    other 2023年7月28日
    00
  • Android关于Glide的使用(高斯模糊、加载监听、圆角图片)

    Android关于Glide的使用(高斯模糊、加载监听、圆角图片) 1. 引入Glide库 要使用Glide库,我们需要将其添加到项目的依赖中。可以在项目的build.gradle文件中添加以下依赖: dependencies { implementation ‘com.github.bumptech.glide:glide:4.9.0’ annotatio…

    other 2023年6月25日
    00
  • 深入学习C++智能指针之shared_ptr与右值引用的方法

    深入学习C++智能指针之shared_ptr与右值引用的方法 本文将介绍C++中的智能指针shared_ptr和右值引用的概念及其用法,其中注意点将在示例中一并说明。 shared_ptr shared_ptr是C++11中的智能指针,用于管理动态分配内存的生命周期。shared_ptr采用引用计数的机制,每个shared_ptr都能访问同一块内存,当最后一…

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