C#中的虚函数virtual

当我们在派生类中重写基类的同名函数时,若基类指针或引用指向派生类对象,这时若基类函数被调用,会调用派生类中的函数而不是基类中的函数。但是,如果将基类指针或引用指向派生类对象的实例时,如果使用基类指针或引用来访问这个函数,则只会调用基类中的函数,而不会调用派生类中的函数。为了解决这个问题,C#中引入了虚函数virtual的机制。

虚函数用来实现多态,将基类中的函数在派生类中标记为virtual,如果派生类中实现了相同的虚函数,则在通过基类指针或引用调用该虚函数时会调用派生类中的虚函数。如果在派生类中未实现该虚函数,则调用基类中的虚函数。

C#中的虚函数定义方式为:

public virtual 返回类型 函数名称(参数列表)
{
    // 函数体
}

下面是两条示例说明:

示例1

public class Shape
{
    public virtual int Area()
    {
        return 0;
    }
}

public class Rectangle : Shape
{
    int length;
    int width;

    public Rectangle(int length, int width)
    {
        this.length = length;
        this.width = width;
    }

    public override int Area()
    {
        return length * width;
    }
}

public class Circle : Shape
{
    int radius;

    public Circle(int radius)
    {
        this.radius = radius;
    }

    public override int Area()
    {
        return (int)(Math.PI * Math.Pow(radius, 2));
    }
}

public class Test
{
    public static void Main(string[] args)
    {
        Shape[] shapes = new Shape[] { new Rectangle(3, 4), new Circle(5) };

        for (int i = 0; i < shapes.Length; i++)
        {
            Console.WriteLine("Area of shape[{0}] = {1}", i, shapes[i].Area());
        }
    }
}

输出结果为:

Area of shape[0] = 12
Area of shape[1] = 78

在这个例子中,我们定义了一个Shape类,其中包含一个Area函数,但这个函数没有任何实现。我们还定义了两个继承自Shape类的派生类,分别是Rectangle和Circle,并且在这两个类中实现了Area函数。在Test类中,我们创建了两个Shape类型数组的实例,并分别调用了其Area函数。由于Area函数被标记为virtual,所以当我们在数组中迭代时,会调用它相应派生类中的实现程序。

示例2

public class Employee
{
    public virtual void PrintName()
    {
        Console.WriteLine("Employee");
    }
}

public class Manager : Employee
{
    public override void PrintName()
    {
        Console.WriteLine("Manager");
    }
}

public class Test
{
    public static void Main(string[] args)
    {
        Employee e = new Employee();
        Employee m = new Manager();

        e.PrintName();  // 输出:Employee
        m.PrintName();  // 输出:Manager
    }
}

在这个例子中,我们定义了两个类,Employee和Manager,其中Manager继承自Employee类,并且覆盖了函数PrintName。在Test类中,我们分别创建了Employee和Manager的实例,并分别调用了它们的PrintName函数。由于PrintName被标记为virtual,调用Manager实例上的PrintName函数时,会调用Manager类中的PrintName实现程序。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中的虚函数virtual - Python技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • asp.net(C#)生成无限级别菜单

    生成无限级别菜单是一个常见的需求,而使用ASP.NET(C#)实现无限级别菜单可以通过递归来解决。以下是实现过程的详细攻略: 创建数据库表 首先,需要在数据库中保存菜单数据,可以通过如下的SQL语句来创建一个menu数据表: CREATE TABLE [dbo].[menu]( [id] [int] IDENTITY(1,1) NOT NULL, [name…

    C# 2023年5月31日
    00
  • winform基于异步委托实现多线程摇奖器

    下面我会详细讲解如何使用异步委托实现winform的多线程摇奖器。 1. 理解异步委托 异步委托是一种多线程编程技术,适用于需要执行耗时操作而不阻塞主线程的情况。在winform中,我们可以使用异步委托来实现多线程的UI操作,比如在后台计算数据、读取文件等操作时,同时不会阻塞用户界面的响应。 在异步委托中,我们可以使用C#语言中提供的BeginInvoke和…

    C# 2023年6月7日
    00
  • C#常用的命名规则汇总

    C#常用的命名规则汇总 在C#中,良好的命名规则对于开发者而言是至关重要的。它可以明确描述代码所实现的功能,提高代码的可读性和可维护性。在本文中,我们将介绍C#中常用的命名规则。 Pascal命名法 Pascal命名法指的是将每个单词的首字母大写的命名方式。比如,定义一个表示学生姓名的变量,可以使用Pascal命名法: string StudentName;…

    C# 2023年5月15日
    00
  • C#编程自学之运算符和表达式

    C#编程自学之运算符和表达式 运算符 C#中的运算符是用来对值进行计算、比较或连接等操作的符号。常用的运算符包括算术运算符、关系运算符、逻辑运算符和赋值运算符等。 算术运算符 算术运算符包括加、减、乘、除、取余数和取负数等。其中加减乘除符号分别为“+”、“-”、“*”、“/”,取余符号为“%”,取负符号为“-”。 // 加减乘除示例 int a = 3; i…

    C# 2023年6月6日
    00
  • C#中的LINQ to Objects详解(2)

    C#中的LINQ to Objects详解(2) 什么是LINQ to Objects LINQ to Objects是针对C#中的对象(包括集合、类等)进行查询和操作的一种语言集成查询方式。它提供了一组标准的查询操作符,可以对对象进行所需的查询和处理操作,支持查询、筛选、排序、分组、连接等多种数据操作。 如何使用LINQ to Objects 使用LINQ…

    C# 2023年6月1日
    00
  • C#中Activator.CreateInstance()方法用法分析

    C#中Activator.CreateInstance()方法用法分析 前言 C#中 Activator.CreateInstance() 方法是一种动态创建实例的方法。在实际项目中,我们常常需要动态加载程序集并创建其中的类型对象。这时,Activator.CreateInstance()方法就可以起到很好的作用。 方法说明 Activator.Create…

    C# 2023年5月31日
    00
  • 让IIS8支持WCF的更简单方法

    让IIS8支持WCF的更简单方法 WCF(Windows Communication Foundation)是一种用于构建分布式应用程序的技术。在IIS8上部署WCF服务时,需要进行一些配置。本文将详细讲解如何让IIS8支持WCF的更简单方法,并提供两个示例。 1. 安装.NET Framework 4.5 在IIS8上部署WCF服务之前,需要先安装.NET…

    C# 2023年5月15日
    00
  • C#实现汉字转拼音或转拼音首字母的方法

    首先,我们需要了解一个术语——拼音库。拼音库是拼音转换的核心,可以使用第三方拼音库或开源拼音库,如pypinyin、jieba等。接着,我们可以使用C#中的第三方库或自己编写代码进行汉字转拼音或转拼音首字母的处理。 具体实现步骤如下: 步骤一:安装拼音库并引入命名空间 安装拼音库,以pypinyin为例,可以使用pip install pypinyin命令进…

    C# 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部