C#的虚方法

当类中的方法声明前加上了virtual修饰符,我们称之为虚方法,反之为非虚。使用了virtual修饰符后,不允许再有static,abstract,或override修饰符。

对于非虚的方法,无论被其所在类的实例调用,还是被这个类的派生类的实例调用,方法的执行方式不变。而对于虚方法,它的执行方式可以被派生类改变,这种改变是通过方法的重载来实现的。

下面的例子说明了虚方法与非虚方法的区别。

程序清单14-3:

using System;
class A
{
 public void F(){Console.WriteLine("A.F");}
 public virtual void G(){Console.WriteLine("A.G");
}
Class B:A
{
 new public void F(){Console.WriteLine("B.F");}
 public override void G(){Console.WriteLine("B.g");}
 }
class Tese
{
 static void Main(){
    B b=new B();
    A a=b;
    a.F();
    b.F();
    a.G();
    b.G();
 }
}

例子中,A类提供了两个方法:非虚的F和虚方法G.类B则提供了一个新的非虚的方法F,从而覆盖了继承的F;类B同时还重载了继承的方法G.那么输出应该是:

A.F
B.F
B.G
B.G

注意到本例中,方法a.G()实际调用了B.G,而不是A.G.这是因为编译时值为A,但运行时值为B,所以B完成了对方法的实际调用.

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索方法
, public
, console
, WriteLine
, void
虚方法
c站、c语言、cf、ch、c罗,以便于您获取更多的相关知识。

时间: 2024-11-02 00:53:17

C#的虚方法的相关文章

C#类中虚方法相互调用的潜在重载错误

错误    当我们编写基类虚方法时,需要注意一个问题,就是基类中虚方法的相互调用,有可能引起派生类重载时的潜在错误隐患.当然这个错误并不是C#语言设计的缺陷,而是一个不可避免的实现而已.当然如果我们是要编写通用的组建基类,就需要注意一下了.     或许我们刚开始做OOP的时候,对于有没有方法有没有virtual根本不在乎,很多是时候我们都重写了(rewrite)了基类方法.当然在需要确定重载(override)的时候,virtual关键字限定基类方法是不可少的.那么是不时我们就可以把基类的方法

C#中虚方法重载

在C#中,进行虚方法的重载有些体会,现与大家分享. 首先请大家看看下面的例子, using System; abstract public class contact { public virtual string prinf() { return ("这是虚方法"); } } public class class1:contact { public string prinf() { return ("这是新的方法");//但这会出现编译警告,因为已经从contac

关于C#中虚方法重载的说明

在C#中,进行虚方法的重载有些体会,现与大家分享.首先请大家看看下面的例子,using System; abstract public class contact{ public virtual string prinf() { return ("这是虚方法"); }} public class class1:contact{ public string prinf() { return ("这是新的方法");//但这会出现编译警告,因为已经从contact那继承了

在派生类中对虚方法进行重载

先让我们回顾一下普通的方法重载.普通的方法重载指的是:类中两个以上的方法(包括隐藏的继承而来的方法),取的名字相同,只要使用的参数类型或者参数个数不同,编译器便知道在何种情况下应该调用哪个方法. 而对基类虚方法的重载是函数重载的另一种特殊形式.在派生类中重新定义此虚函数时,要求的是方法名称.返回值类型.参数表中的参数个数.类型.顺序都必须与基类中的虚函数完全一致.在派生类中声明对虚方法的重载,要求在声明中加上override关键字,而且不能有new,static或virtual修饰符. 还是让我

CLR怎样实现虚方法的多态调用(2)

在上一篇文章CLR怎样实现虚方法的多态调用(1)中主要介绍了CLR怎样多态调用虚方法以及各种类型 的方法在Method Table中的排布,但是没有介绍怎样调用接口方法,当某个对象向上转型为接口时进行多 态调用时,CLR是怎样实现的呢?以下面这段代码为例来说明: namespace Demo { public interface IFoo { void Foo(); } public class Base : IFoo { public void Foo() { Console.WriteLin

CLR怎样实现虚方法的多态调用(1)

最近一直对.net framework中,虚方法的调用是如何实现这个问题有些疑惑,在看了Essential .Net 关于Method的那一章和Artech推荐的文章Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects以后,还是一知半解,有些疑惑得不到答案.主要有这些: 父类定义的非虚方法是否在子类中有拷贝? 虚方法是如何实现多态的? 子类继承父类的虚方法实现是否和继承非虚方法机制相同? 如果

关于java虚方法

问题描述 小弟再看<深入理解jvm>这本书时,里面经常会提到java虚方法,例如下面这句:"java语言中虽然没有virtual关键字,但是使用虚方法的频率却远大于C/C++语言,这意味着运行时对方法接受者进行多态选择的频率要远远大于C/C++"这句话该怎么办理解呢?其中的java虚方法又是什么?求大神指点,拜谢 解决方案

C+++中的基类的虚方法在派生类中设为虚的还是非虚方法好?

问题描述 C+++中的基类的虚方法在派生类中设为虚的还是非虚方法好? //brass.h -- bank account classes#ifndef BRASS_H_#define BRASS_H_#include //brass account classclass Brass{private: std::string fullName; //x姓名 long acctNum; //账号 double balance; //当前结余public: Brass(const std::strin

[求助]关于C#重写C++虚方法中指针的问题

问题描述 在C++中定义了一个虚方法,里面没写任何实现,现在我应该怎么处理这个指针?publicunsafeoverridevoidon_message(SockViewpSocket,byte*ptrData,intlength){base.on_message(pSocket,ptrData,length);} 解决方案 解决方案二:你这个是C++?你这个是C#吧.哪里来的C++解决方案三:引用1楼caozhy的回复: 你这个是C++?你这个是C#吧.哪里来的C++ C++代码以及打包在dl