C#中的虚函数virtual

yizhihongxing

当我们在派生类中重写基类的同名函数时,若基类指针或引用指向派生类对象,这时若基类函数被调用,会调用派生类中的函数而不是基类中的函数。但是,如果将基类指针或引用指向派生类对象的实例时,如果使用基类指针或引用来访问这个函数,则只会调用基类中的函数,而不会调用派生类中的函数。为了解决这个问题,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日

相关文章

  • 从C#中的数组中删除指定元素的几种方法,超简单

    最近小编同事面试遇到了一道面试题,题目是有个int数组,把输入包含的指定元素删除。这道题主要考察C#基础知识和编码动手能力。小编将以如下几种方法实现,供大家参考。(注:文末还有扩展问题。) 1、使用临时数组copy后替换 这种方法涉及创建一个比原始数组小一个元素的新数组。然后,将原始数组复制到新数组中,但不包括要删除的元素。最后,将新数组分配给原始数组。示例…

    C# 2023年4月18日
    00
  • ASP.NET Core 5.0中的Host.CreateDefaultBuilder执行过程解析

    ASP.NET Core 是一种开源的、跨平台的、高性能的 Web 应用程序框架。其中 Host.CreateDefaultBuilder 是一个 ASP.NET Core 5.0 的新特性,它提供了一个有用的方法来快速地搭建一个 Web 应用程序的主机。本攻略将详细讲解 ASP.NET Core 5.0 中的 Host.CreateDefaultBuild…

    C# 2023年6月3日
    00
  • C# 线程安全详解

    C#线程安全详解 什么是线程安全 线程安全指的是当多个线程同时访问同一个资源时,能够保证程序不会出现并发问题,不会导致数据的不一致或异常情况。 在 C# 中,线程安全一般涉及到以下几种情况: 多个线程同时访问同一个实例方法 多个线程同时访问静态方法 多个线程同时访问字段、属性或变量 线程安全的解决方法 为了保证线程安全,可以采用以下几种方法: 1.使用锁 锁…

    C# 2023年5月15日
    00
  • C#实现批量更改文件名称大小写或扩展名

    下面是详细讲解“C#实现批量更改文件名称大小写或扩展名”的完整攻略。 问题描述 有时候我们需要将多个文件的名称进行更改,例如将文件名称的大小写规范化,或者将文件的拓展名更改为另一种形式。手动更改一两个文件可以使用Windows资源管理器来完成,但如果需要更改数量较多的文件,则手动操作将非常费时费力。因此,我们需要一种批量操作的方法。 解决方案 我们可以使用C…

    C# 2023年6月1日
    00
  • ASP.NET Core MVC 从入门到精通之接化发(二)

    随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员。 经过前两篇文章的讲解,初步了解ASP.NET Core MVC项目创建,启…

    C# 2023年4月18日
    00
  • cnblogs csdn 代码运行框实现代码

    如果想在博客中展示代码的运行效果,可以借助一些第三方的代码运行框。像cnblogs和csdn都提供了这样的功能,可以直接在文章中展示代码的执行结果、输出或图形等,非常实用。下面是使用cnblogs和csdn实现代码运行框的攻略。 一、cnblogs 代码运行框实现 1. 准备 首先,需要在博客园中打开“源代码”模式,即切换到HTML源代码编辑模式,才能够使用…

    C# 2023年5月31日
    00
  • 正确使用dotnet-*工具的方法

    使用 dotnet- 工具是在 .NET Core 中执行各种任务的一种方便的方法。这些工具包括 dotnet build、dotnet run、dotnet test 等。以下是正确使用 dotnet- 工具的完整攻略: 步骤一:安装 .NET Core SDK 首先,需要安装 .NET Core SDK。可以从 Microsoft 的官方网站下载并安装 …

    C# 2023年5月17日
    00
  • C# 扩展方法的使用

    C# 扩展方法是一种特殊的静态方法,可以为现有的类类型(包括基元类型、引用类型、结构类型和枚举类型等)添加额外的方法,而无需创建派生类或使用继承。扩展方法的使用使得我们可以为系统自带的类型添加自定义的方法,也可以对外部封装的类型进行方法扩展以实现特定的功能。下面是使用C#扩展方法的完整攻略,包含以下几个步骤: 1. 创建静态类 为了定义扩展方法,我们需要创建…

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