C#之修饰符-----virtual和override

C#(virtual、new、override) 我们使用基类引用访问派生类对象时,得到的是基类的成员(用基类来访问派生类时基类返回基类,派生类返回派生类)。当使用虚方法(virtual)时,可以得到派生类的成员和函数(当使用虚方法virtual和覆写override标记时,输出的都是派生类的成员)。多态是面向对象编程的基本特征之一,它使得派生类(子类)的实例可以直接赋予基类(父类)的对象,然后直接通过这个对象调用派生类的方法。那么在对派生类实例的调用中,该虚方法(virtual)使用的是基类定义的方法。2、基类的方法使用virtual标注。 阅读详情
virtual(C# 参考)

 

virtual 关键字用于修饰方法、属性、索引器或事件声明,并且允许在派生类中重写这些对象。例如,此方法可被任何继承它的类重写。

public virtual double Area() 
{
    return x * y;
}

虚拟成员的实现可由派生类中的重写成员更改。有关使用 virtual 关键字的更多信息,请参见使用 Override 和 New 关键字进行版本控制(C# 编程指南) 和了解何时使用 Override 和 New 关键字(C# 编程指南)。

调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。

默认情况下,方法是非虚拟的。不能重写非虚方法。

virtual 修饰符不能与 static、abstract, private 或 override 修饰符一起使用。

除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。

  • 在静态属性上使用 virtual 修饰符是错误的。

  • 通过包括使用 override 修饰符的属性声明,可在派生类中重写虚拟继承属性。

 
override(C# 参考)

 

要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虚实现,必须使用 override 修饰符。

在此例中,类 Square 必须提供 Area 的重写实现,因为 Area 是从抽象的 ShapesClass 继承而来的。

abstract class ShapesClass
{
    abstract public int Area();
}

class Square : ShapesClass
{
    int x, y;
    // Because ShapesClass.Area is abstract, failing to override
    // the Area method would result in a compilation error.
    public override int Area()
    {
        return x * y;
    }
}

有关 override 关键字用法的更多信息,请参见使用 Override 和 New 关键字进行版本控制以及了解何时使用 Override 和 New 关键字。

override 方法提供从基类继承的成员的新实现。通过 override 声明重写的方法称为重写基方法。重写的基方法必须与 override 方法具有相同的签名。有关继承的信息,请参见继承。

不能重写非虚方法或静态方法。重写的基方法必须是 virtual、abstract 或 override 的。

override 声明不能更改 virtual 方法的可访问性。override 方法和 virtual 方法必须具有相同的访问级别修饰符。

不能使用修饰符 new、static、virtual 或 abstract 来修改 override 方法。

重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是 virtual、abstract 或 override 的。

【从零开始入门unity游戏开发之——C#篇25】C#面向对象动态多态——virtual、override 和 base 关键字、抽象类和抽象方法 C#面向对象动态多态——virtual、override 和 base 关键字、抽象类和抽象方法 阅读详情

相关推荐

C#大杂烩&&修饰符完整精解(static,const,readonly,sealed,abstract,new、virtual,override)

此文分为五大块分解,尽量同类概括C#中的修饰符 一 访问控制符 访问控制符 同一程序集 同一程序集 同一程序集 不同程序集 不同程序集 访问控制符 同类 子类 非子类 子类 非子类 public Yes Yes Yes Yes Yes protected internal Yes Yes Yes Yes No protected Yes Yes No Yes No ...

TurboQ珞珈 339

C#里virtual和override

MSDN官方解释:The implementation of a virtual member can be changed by an overriding member in a derived class. 意思就是虚类可以被重写覆盖 Version with the Override and New Keywords 地址连接:https://msdn.microsoft.c

qq_23559599的博客 1062

【GNSS/Linux】BKG Ntrip Client (BNC) 的编译与安装

【GNSS/Linux】BKG Ntrip Client (BNC) 的编译与安装 1. BNC软件 1.1 软件介绍 The BKG Ntrip Client (BNC) is an Open Source multi-stream client program designed for a variety of real-time GNSS applications. It was primarily designed for receiving data streams from any Ntrip

小马甲的新马甲 7804

C#中的virtual和override关键字

本文介绍了C#中的virtual和override关键字。

mingupup的博客 458

Echats-wordcloud 文字云图的踩坑点【Unknown series wordCloud】

一直都是报 【ECharts Unknown series wordCloud】这玩意可能要刷脸,祝你好运吧~

Sky_Bug的博客 2418

CMakeTestCCompiler.cmake错误解决

CMakeTestCCompiler.cmake错误解决欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 最近编译项目的时候,遇到一个cmake的错误,具体错误信息如下: /path-to-pr

昨夜星辰的博客 2万+

c#继承中的new、virtual、override

因此,虽然是用compute对象调用自己的playGame方法,但是此时对应内存已经被Lenovo类的playGame方法覆盖了,所以表现形式为使用了Lenovo类的playGame方法。计算机会分配空间存储Lenovo类中所有非静态的成员,在这个过程中,不仅会为自己本身的WriteDocument方法分配空间,同时还会为从Compute类中继承而来的成员分配空间,如下所示。时,实际上compute对象分配的空间是整个Lenovo类的空间,但是compute对象只能调用属于Compute部分的成员。

chang_zhu的博客 1857

pyinstaller+scrapy打包出现错误:OSError: could not get source code

错误如下: Traceback (most recent call last): File "scrapy\utils\defer.py", line 55, in mustbe_deferred File "scrapy\core\spidermw.py", line 60, in process_spider_input File "scrapy\core\scraper.py", line 152, in call_spider File "scrapy\utils\misc.py

kin的博客 1759

C# 修饰符

访问修饰符 C# 中常用的有 private、public、protected、internal 4个访问修饰符。 private:私有访问是允许的最低访问级别,私有成员只有在声明它们的类和结构中才可以访问。 public:公共访问是允许的最高访问级别,对访问公共成员没有限制。 protected:受保护成员在它的类中可以访问并且可有派生类访问。 interna...

weixin_30782331的博客 95

Qoder + ADB Supabase :5分钟GET超火AI手办生图APP

本文介绍如何利用Qoder、阿里云 ADB Supabase 和通义千问图像编辑模型,快速构建AI手办生图Flutter应用。无需传统后端,通过AI生成代码、BaaS服务与边缘函数调用,实现从原型到上线的敏捷开发,全流程轻量高效,助力Vibe Coding落地实践。

数据库技术 931

基于rms包的限制性立方样条回归(RCS)R代码实现

RCS

2301_79584199的博客 2万+

C#中继承修饰符(virtual/abstract/sealed)

C#的方法引入了virtual、override、sealed、abstract四种修饰符来提供不同的继承需求。类的虚方法是可以在该类的继承类中改变其实现的方法,当然这种改变仅限于方法体的改变,而非方法头(方法声明)的改变。被子类改变的虚方法必须在方法头加上override来表示。当一个虚方法被调用时,该类的实例——亦即对象的运行时类型(run-time type)来决定哪个方法体被调用。看下面的

Mobidogs Blog 2376

基于STM32设计的智能防盗单车锁_349

本设计基于STM32F103RCT6单片机,研制了一种适用于户外环境的智能防盗单车锁系统。系统集成了GPS定位模块、ADXL345加速度传感器、4G通信模块(Air780E)、OLED显示屏、继电器模拟锁控模块等硬件,通过姿态感知实现车辆异常移动检测,在锁车状态下自动触发蜂鸣器报警并通过短信与APP通知用户。

866

C#修饰符

修饰符用于限定类型以及类型成员的申明 从定义可以看出按功能分为两类:访问修饰符和声明修饰符 1.访问修饰符 (5个) 访问修饰符 说明 public 公有访问。不受任何限制。 private 私有访问。只限于本类成员访问,子类,实例都不能访问。 protected 保护访问。只限于本类和子类访问,实例不能访问。 ...

baidu_25789233的博客 192

伺服系统控制原理深度解析

摘要:本文系统阐述了伺服系统的控制原理与应用。首先介绍了伺服系统的定义、组成及其在工业自动化中的重要性;然后详细分析了反馈控制机制、稳定性判据和性能指标;重点推导了传递函数和状态空间两种数学模型,并通过LaTeX公式展示了二阶系统建模过程;进而对比了PID控制、状态反馈及自适应控制等方法的优缺点;最后结合数控机床等案例,验证了理论方法的有效性,并展望了伺服系统智能化发展趋势。全文兼顾理论深度与实践指导性,为控制工程领域提供了系统的技术参考。

技术工作者 1264

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C#区分abstract、virtual、override和new

abstract、virtual、override和new是在类别的继承关系中常用的四个修饰方法的关键字,在此略作总结。 1. 常用的中文名称: abstract => 抽象方法。  virtual => 虚拟方法。 override => 覆盖基础类别方法。 new => 隐藏基础类别方法。 override 和 new 有时都叫复写基

stod500的专栏 576

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

C#的修饰符

C#修饰符之类修饰符:public、internal、 partial、abstract、sealed、static C#修饰符之成员修饰符:public、protected、private、internal、sealed、abstract、virtual、override、readonly、const c#里面一共有五种访问修饰符,五种中每个种的访问权限都是不一样的 public...

diaozhu8194的博客 419

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

读书札记:static,virtual,override,abstract四个修饰符区别

static,virtual,override,abstract四个修饰符区别 Virtual方法(虚方法) virtual 关键字用于修饰方法、属性、索引器或事件声明,并且允许在派生类中重写这些对象。例如,此方法可被任何继承它的类重写。 调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。 默认情况下...

信息无障碍 320

C# 访问修饰符和声明修饰符

一、访问修饰符的基本说明 1.public: 公有的,是类和类成员的访问修饰符,访问不受限制 2.private: 私有的,是一个成员访问修饰符,不能修饰类,只有在声明它的类和结构内部可以访问 3.internal: 内部的,是类和类成员的访问修饰符,同一个程序集中的所有类都可以访问,可访问性低于public 4.protected: 受保护的,是一个成员访问修饰符,只能在它的类和派生类中访问 5.protected internal: 访问限于当前程序集或派生类 6.private protected:

qq_39806817的博客 1082

C# 4个方位修饰符和8个声明修饰符详解

一、访问修饰符 (添加到类、结构或者成员声明的关键词,控制访问权限) 4个方位修饰符 1.Private:私有的,是一个成员访问修饰符。只有在声明它们的类和结构中才可以访问。 注:类或者成员默认的访问权限。 2.Public:公有的,是类型和类型成员的访问修饰符。对其访问没有限制。 3.Internal:内部的,是类型和类型成员的访问修饰符。同一个程序集中的所有类都可以访问 4. Protected:受保护的,是一个成员访问修饰符。只能在它的类和它的派生类中访问。 5.protec...

天马3798 987

virtual/abstract 和 override/new/sealed

virtual 表示父类中方法可被重写(父类中未声明为virtual的即不可被重写); abstract 表示方法为抽象类,声明时不含方法体,且所在类也需变为抽象类; override 表示子类中重写的方法(父类中被继承的方法应该是virtual或abstract) new 表示覆盖父类中的方法,不管该方法是否是可重写的,均可覆盖 sealed 表示密封/保护子类中继承父类的方法,非继承方...

化甘 245

C#中virtual,abstract,override修饰符

C#的方法引入了virtual、override、sealed、abstract四种修饰符来提供不同的继承需求。类的虚方法是可以在该类的继承类中改变其实现的方法,当然这种改变仅限于方法体的改变,而非方法头(方法声明)的改变。被子类改变的虚方法必须在方法头加上override来表示。当一个虚方法被调用时,该类的实例——亦即对象的运行时类型(run-time type)来决定哪个方法体被调用。看下面的

hyaxi的专栏 1590

三天入门C#系列之修饰关键字概述C#基础概述C#修饰符概述(超详细)(接上期)

我们来接着上期的内容,这期讲解C#中的修饰关键字 在你阅读这篇博客之前,你需要注意的是,这篇博客都是博主的个人理解,并不是官方的说法,如果有更好的建议可以私信博主,如果有什么地方看不懂也可以私信博主。 为了避免丢失,关注——>获得后续更新。 下面我们进入正题 修饰关键字(又称修饰符)可以分为以下几类(自己的理解) 访问修饰符 方法修饰符 约束修饰符 其他修饰符 我们仅仅接绍一些常用的修...

sp2673071736的博客 605

C#修饰符:类修饰符和成员修饰符

C#修饰符之类修饰符:public、internal、partial、abstract、sealed、static Internal:本程序集内的成员可以访问。Partial:部分类,可以将一个类分成几部分写在不同文件中,最终编译时将合并成一个文件,且各个部分不能分散在不同程序集中。C#修饰符之成员修饰符:public、protected、private、internal、sealed、abstract、virtual、override、readonly、constPublic:最开放,所有的本程序集以及其

1191

C#关键字sealed override abstract virtual new总结

sealed和JAVA语言中的final一样,可以用来修饰类,实例方法,属性。 密封类不能被继承,密封方法重写基类方法,但不能被任何派生类进一步重写。当应用于方法和属性时,sealed修饰符必须始终与override一起使用。 sealed class SealedClass  {     public int x;      public int y; } 上面的例子如果试图继承S

itcolossus的专栏 610

C#常用修饰符

访问修饰符是一些关键字,用于指定声明的成员或类型的可访问性,C#有4个访问修饰符:public、private、protected、internal

qq_43587965的博客 414
上一篇: C#之修饰符-----abstract
下一篇: C#中Dispose和Close的区别
NETZHOU
博客等级 码龄24年 10粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值