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日

相关文章

  • C#实现文件上传下载Excel文档示例代码

    下面我将详细讲解C#实现文件上传下载Excel文档的示例代码攻略。 1. 实现文件上传 1.1 编写HTML表单 首先,我们需要在前端编写一个HTML表单,让用户选择要上传的文件和提交表单。 <form action="UploadFileHandler.ashx" enctype="multipart/form-data…

    C# 2023年5月15日
    00
  • C# WinForm制作登录界面的实现步骤

    下面就是详细讲解C# WinForm制作登录界面的实现步骤的完整攻略。 一、创建WinForm应用程序 首先打开Visual Studio并创建一个新的WinForm应用程序。可以通过依次单击“文件”>“新建”>“项目”>“WinForms应用程序”来创建它。 二、设计登录界面 在新创建的WinForm应用程序中,打开Form1.cs并进行…

    C# 2023年6月6日
    00
  • C#中多态现象和多态的实现方法

    下面来详细讲解一下”C#中多态现象和多态的实现方法”的攻略。 什么是多态? 多态,英文名为Polymorphism,是指在面向对象编程中,同一种行为表现出不同的形态和用途,也是一种很强大的面向对象编程特性。 在实际应用中,多态通常指的是一个变量(或参数、返回值等)能够具有多种类型,且能够根据不同的类型而呈现出多种不同的行为的能力,这种能力通常是通过继承、重载…

    C# 2023年6月7日
    00
  • C#中的Action、Func和Predicate如何使用

    C#中的Action、Func和Predicate是三个常用的委托类型,它们分别表示参数列表不同的无返回值、有返回值、返回布尔值的委托。 Action Action是一个表示参数类型为void的无返回值委托类型。可以定义最多16个输入参数的Action,用法如下: // 定义一个无参数的Action Action action1 = () => Con…

    C# 2023年6月6日
    00
  • 图文介绍c#封装方法

    图文介绍c#封装方法 在c#编程中,封装是面向对象编程中一个非常重要的概念,它允许我们将数据和方法包装到一起,并限制对其的访问。在本文中,我们将介绍如何在c#中封装方法,并提供两个示例以说明如何使用封装方法。 什么是封装 封装指的是将数据和方法包装到一起,以隐藏其具体实现细节,并限制对其的直接访问。在c#中,我们使用访问修饰符来控制对数据和方法的访问级别。包…

    C# 2023年6月3日
    00
  • C#使用foreach语句简单遍历数组的方法

    C#的foreach语句是一种简单遍历数组的方法,可以快速方便地遍历数组中的元素。下面我们来详细讲解如何使用foreach语句进行数组遍历: 1.基本语法 foreach语句的基本语法如下: foreach (var item in array) { // 遍历的操作 } 其中var item是用来表示遍历到的数组元素的变量名,array则是需要遍历的数组名…

    C# 2023年6月7日
    00
  • C# 正则表达式经典分类整理集合手册

    下面是对于“C#正则表达式经典分类整理集合手册”的完整攻略。 什么是正则表达式 正则表达式是一种针对文本进行匹配和替换的强大工具,使用正则表达式可以更快、更准确的进行字符串操作。C#自带了正则表达式相关的类库,可以直接进行使用。 正则表达式的语法 正则表达式的语法相对比较复杂,需要花费一定的时间学习和掌握。下面是几个常见的符号和语法结构: .:匹配除换行符以…

    C# 2023年5月15日
    00
  • C#多线程TPL模式下使用HttpClient

    C# 多线程 TPL 模式下使用 HttpClient 的攻略如下: 1. 确定使用的 HttpClient 实例 在多线程场景下使用 HttpClient,首先需要确定使用的 HttpClient 实例。可以选择以下方式: 创建 HttpClient 的静态实例,多个线程共享同一个 HttpClient 实例。 为每个线程创建一个 HttpClient 实…

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