抽象函数和虚函数有什么区别?

更新时间:2023-07-06 06:19:45 阅读: 评论:0

抽象函数和虚函数有什么区别?
抽象函数和虚函数有什么区别? 建议在哪种情况下使⽤虚拟或抽象? 哪种⽅法最好?
#1楼
已经多次提供了答案,但是有关何时使⽤每种⽅法的问题是设计时的决定。 我将尝试将常见的⽅法定义捆绑到不同的接⼝中并将它们拉⼊适当的抽象级别的类中作为⼀种好习惯。 当可能最好定义⼀个实现⼀组简洁接⼝的⾮抽象类时,将⼀组常见的抽象和虚拟⽅法定义转储到类中会使该类变得⽆法区分。 与往常⼀样,这取决于最适合您的应⽤程序特定需求的内容。
低能#2楼
抽象功能:
1. 它只能在抽象类内部声明。
2. 它仅包含⽅法声明,⽽不包含抽象类中的实现。
3. 必须在派⽣类中重写它。
虚函数:
1. 它可以在抽象类以及⾮抽象类中声明。
2. 它包含⽅法的实现。
3. 它可能会被覆盖。
#3楼
我在某些地⽅看到了抽象⽅法的定义如下。 **
“必须在⼦类中实现抽象⽅法”
**我感觉就像。
如果⼦类也是 , 则不必在⼦类中实现抽象⽅法。
1)抽象⽅法不能是私有⽅法。 2) 不能在同⼀抽象类中实现Abstract⽅法。
我要说的是..如果我们要实现⼀个抽象类,则必须重写基本抽象类中的抽象⽅法。 因为..实现抽象⽅法是使⽤覆盖关键字。类似于Virtual⽅法。
不必在继承的类中实现虚拟⽅法。
----------CODE--------------
public abstract class BaClass
{
public int MyProperty { get; t; }
protected abstract void MyAbstractMethod();
public virtual void MyVirtualMethod()
{
var x = 3 + 4;
}
}
public abstract class myClassA : BaClass
{
public int MyProperty { get; t; }
//not necessary to implement an abstract method if the child class is also abstract.
protected override void MyAbstractMethod()
{
throw new NotImplementedException();
}
}
public class myClassB : BaClass
{
public int MyProperty { get; t; }奥斯卡金曲下载
//You must have to implement the abstract method since this class is not an abstract class.
protected override void MyAbstractMethod()
{
throw new NotImplementedException();
}
}
#4楼
抽象函数不能具有主体,并且必须由⼦类覆盖
虚函数将有⼀个主体,并且可能会或可能不会被⼦类覆盖
#5楼
上⾯的⼤多数⽰例都使⽤代码-⽽且⾮常好。 我⽆需多说,但以下是使⽤类⽐⽽不是代码/技术术语的简单说明。
简单说明-使⽤类⽐说明
抽象⽅法
想想乔治·W·布什。 他对⼠兵说:“去伊拉克打仗”。 就是这样。 他所指定的只是必须打架。 他没有具体说明将如何发⽣。 但是我的意思是,你不能只是出去战⽃⽽已:这到底是什么意思? 我要和B-52或我的杀⼈狂战⽃? 这些具体细节留给别⼈。 这是⼀种抽象⽅法。
虚⽅法
⼤卫·彼得雷乌斯(David Petraeus)参军。 他定义了战⽃的含义:
1. 寻找敌⼈
2. 中和他。
3. 之后喝啤酒
问题在于这是⼀种⾮常通⽤的⽅法。 这是⼀个⾏之有效的好⽅法,但有时不够具体。 对彼得雷乌斯来说,好事是他的命令有余地和范围-他允许其他⼈根据他们的特殊要求更改他对“战⽃”的定义。
Private Job Bloggs阅读Petraeus的命令,并根据他的特殊要求获准实施⾃⼰的战⽃版本:
1. 寻找敌⼈。
2. 射中他的头。
3. 回家
4. 喝啤酒
努⾥·马利基(Nouri al Maliki)也收到彼得雷乌斯(Petraeus)的同样命令。 他也要战⽃。 但是他是政客,⽽不是步兵。 显然,他不能四处射击他的政客敌⼈。 由于彼得雷乌斯为他提供了⼀种虚拟⽅法,因此马利基可以根据⾃⼰的具体情况实施⾃⼰的战⽃⽅法版本:
1. 寻找敌⼈。
2. 让他以⼀些BS⼤败诉被捕。
3. 回家
4. 喝啤酒
换句话说,虚拟⽅法提供样板指令-但这只是⼀般性指令,军队中的各个阶层的⼈可以根据⾃⼰的具体情况使这些指令更加具体。
两者的区别
乔治·布什(George Bush)没有证明任何实施细节。 这必须由其他⼈提供。 这是⼀种抽象⽅法。
另⼀⽅⾯, Petraeus 确实提供了实现细节,但他已允许他的下属使⽤他们⾃⼰的版本覆盖其命令,如果他们能提出更好的建议。
希望能有所帮助。
#6楼
抽象函数(⽅法):
●抽象⽅法是使⽤关键字abstract声明的⽅法。
●它没有⾝体。
●应该由派⽣类实现。
●如果⽅法是抽象的,则该类应该抽象。
虚函数(⽅法):
公共英语培训学校●虚⽅法是⽤关键字virtual声明的⽅法,可以通过使⽤override关键字由派⽣类⽅法覆盖。
●是否覆盖它取决于派⽣类。
#7楼
C#中没有调⽤虚拟类的内容。
对于功能
1. 抽象函数仅具有签名,驱动器类应覆盖功能。
2. 虚拟功能将保留驱动器类根据功能的要求可以覆盖或不覆盖的部分功能
您可以根据⾃⼰的要求决定。
#8楼
说明:类推。 希望它将对您有所帮助。
语境
我在建筑物的21楼⼯作。 我对⽕灾抱有偏执。 时不时地,在世界某个地⽅,⼤⽕烧毁了刮板。 但幸运的是,在这⾥,我们有⼀份说明⼿册,介绍发⽣⽕灾时的处理⽅法:
雾都孤儿
⽕灾逃⽣()
1. 不要收拾财物
2. 步⾏逃⽣
3. ⾛出⼤楼
这基本上是⼀个称为FireEscape()的虚拟⽅法
虚⽅法
该计划在99%的情况下都⾮常好。 这是可⾏的基本计划。 但是,只有1%的可能性防⽕通道会被阻塞或损坏,在这种情况下,您将完全被拧紧,除⾮采取严厉措施,否则您将变成烤⾯包。 使⽤虚⽅法,您可以做到这⼀点:您可以使⽤⾃⼰的计划版本覆盖基本的
FireEscape()计划:
1. 跑到窗⼝
2. 跳出窗外
3. 安全降落伞到底部
换句话说, 虚拟⽅法提供了⼀个基本计划,如果需要,可以将其覆盖 。 如果程序员认为合适,⼦类可以覆盖⽗类的虚拟⽅法。
抽象⽅法2016年3月19日
并⾮所有组织都进⾏了深⼊的研究。 ⼀些组织不进⾏消防演习。 他们没有整体的逃⽣政策。 每个⼈都是他⾃⼰。 管理层仅对现有这样的政策感兴趣。
换句话说,每个⼈被迫发展⾃⼰的FireEscape()⽅法。 ⼀个⼈会⾛出防⽕梯。 另⼀个家伙会降落伞。 另⼀个家伙将使⽤⽕箭推进技术从建筑物上飞⾛。 另⼀个家伙会逃⾛。 只要您有基本的FireEscape()计划,管理⼈员就不会在意您如何逃⽣-如果没有,您可以保证OHS会像⼀吨砖⼀样落在组织上。 这就是抽象⽅法的含义。
两者⼜有什么区别?
抽象⽅法:⼦类被强制实现⾃⼰的FireEscape⽅法。 使⽤虚拟⽅法时,您有⼀个基本计划正在等待您,但是如果还不够好的话,可以选
择实施⾃⼰的计划。
现在不是那么难吗?
#9楼
您必须始终重写抽象函数。
从⽽:
抽象函数 - 继承者必须提供⾃⼰的实现时
虚拟 - 由继承者决定
#10楼
抽象函数不能具有功能。 您基本上是在说,任何⼦类都必须提供⾃⼰的该⽅法的版本,但是它太笼统了,甚⾄⽆法尝试在⽗类中实现。
北京雅思家教虚函数基本上是在说看,这⾥的功能对于⼦类来说可能⾜够好,也可能不够好。 因此,如果⾜够好,请使⽤此⽅法;否则,请覆盖我并提供您⾃⼰的功能。
#11楼
抽象函数没有实现,只能在抽象类上声明。 这将强制派⽣类提供实现。
虚函数提供了默认实现,它可以存在于抽象类或⾮抽象类上。
因此,例如:
public abstract class myBa
{
美容养生培训
//If you derive from this class you must implement this method. notice we have no method body here either
public abstract void YouMustImplement();
//If you derive from this class you can change the behavior but are not required to
public virtual void YouCanOverride()
{
关于爱情的英文句子}
}
public class MyBa
{
//This will not compile becau you cannot have an abstract method in a non-abstract class
public abstract void YouMustImplement();
}
#12楼
从⼀般的⾯向对象的观点来看:
关于抽象⽅法 :实际上,当您将抽象⽅法放在⽗类中时,您对⼦类说的是:嘿,请注意您具有这样的⽅法签名。 如果您想使⽤它,则应该⾃⼰实现!
关于虚函数 :在⽗类中放置虚⽅法时,您对派⽣类说的是:嘿,这⾥有⼀项功能可以为您做⼀些事情。 如果这对您有⽤,请使⽤它。 如果没有,重写它并实现您的代码,即使您可以在代码中使⽤我的实现!
这是关于通⽤OO中这两个概念之间差异的⼀些哲学
#13楼
绑定是将名称映射到代码单元的过程。
后期绑定意味着我们使⽤了名称,但是推迟了映射。 换句话说,我们⾸先创建/提及名称,然后让⼀些后续过程处理代码到该名称的映射。现在考虑:
与⼈类相⽐,机器真的很擅长搜索和分类
与机器相⽐,⼈类真的很擅长发明和创新braun>afriendinneedisafriendindeed
因此,简短的答案是: virtual是机器的后期绑定指令(运⾏时),⽽abstract是⼈的后期绑定指令(程序员)
换句话说, virtual意味着:
“亲爱的运⾏时 ,通过尽⼒⽽为将适当的代码绑定到该名称: 搜索 ”

本文发布于:2023-07-06 06:19:45,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/168604.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:抽象   函数   实现
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图