Virtual和override的区别

如题所述

override是对父类的覆盖或者重载,也就是说父类肯定有定义这个函数,或者有同名的重载函数

virtual是在父类肯定有进行申明,但是函数是没有本体的。相当于一个接口允许子类进行同名化也是方便子类函数的继承更方便!~两个不同定义的子类可以通过同一个过程调用不同的函数,一般都是通过Virtual来定义的!~

例如 var a :array [0..1] of stream;

a[0]:=TMemoryStream.Create;
a[1]:=TStringStream.Create;
for i:=0 to 1 do
a[i].clear;
最后这个clear就是通过Stream的Vitrual来调用的,可以用同一个函数名,但是它们的Clear的实际方法却是不同的,各自是 StringStream MemoryStream分别定义的。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-04-12
Virtusal 是虚方法啊,,,,Override这个是覆盖方法啊, 在虚方法中不能包括Overrde abstract static 等 修饰符

而在哪个覆盖的方法啊就可以,包括 new static virtual 还可以有 abstrasct
第2个回答  2013-04-12
1、override表示以继承的父类方法
2、virtual(虚拟方法)和dynamic(动态方法)表示:后代类可以override祖先的同名方法,在override过程的实现里,还可以用inherited调用祖先的同名方法,virtual(虚拟方法)和dynamic(动态方法)两者的差异在于方法指针的保存,virtual方法使用VMT(Virtual Method Table),也就是说,每一个该类的后代类都拥有整个的VMT,其优点在于速度快,因为类的实例可以直接从VMT中找到该方法的入口,但它也耗用较多的内存;相对的dynamic方法则不使用VMT,如果类的后代没有override该方法,那么需要从它的父类去查找方法的入口,它的优点是少用内存,因为子类只保留它override的方法入口,缺点是速度较慢,尤其在多级继承的时候,可能需要前溯好多层才找到方法的。
3、一般的理解是,如果该方法其后代类基本都需要override的,使用virtual,如果该方法不经常在后代类中被override的,使用dynamic。
第3个回答  2013-04-12
如果一个方法想用override必须将其定义为抽象(abs..)的或虚(virtual)的

就是重新写一下,或许原来只有一个方法定义,这里是具体的实现
第4个回答  推荐于2018-11-16
重载函数:
(1)参数不同的函数一定是不同的
(2)返回值不同的函数不一定是不同的例如:
int Fun() ;
void Fun() ;
int x = Fun() ;//这个时候就不知道应该调用哪一个函数
区分是不是重载函数的标准:
(1)只能靠函数的参数来区分重载函数
(2)不能靠函数的返回值来区分重载函数
编译之后的名字:_fun_int_int ;(C++中就是这样来区分重载函数的)
注意:并不是函数的名字相同就构成重载,当函数的作用域不同的时候两个重名的函数不能称作重载函数
例如:void print(int x, int y) ;
class A
{
void print(int x) ;//这样不叫函数的重载,因为函数的作用域不同
};
重载和覆盖的区别:(四个方面)
(1)从作用范围来说
(2)函数名称来说
(3)函数参数来说
(4)有没有Virval关键字
《1》重载:
(1)作用范围相同
(2)函数名称相同
(3)函数参数不相同
(4)Virtual关键字有没有都可以
《2》覆盖:
(1)作用范围不相同(分别位于子类和父类)
(2)函数名称相同
(3)函数参数相同
(4)Virtual关键字必须有本回答被网友采纳

Virtual和override的区别
1、override表示以继承的父类方法 2、virtual(虚拟方法)和dynamic(动态方法)表示:后代类可以override祖先的同名方法,在override过程的实现里,还可以用inherited调用祖先的同名方法,virtual(虚拟方法)和dynamic(动态方法)两者的差异在于方法指针的保存,virtual方法使用VMT(Virtual Method Table),...

Virtual和override的区别
override是对父类的覆盖或者重载,也就是说父类肯定有定义这个函数,或者有同名的重载函数。virtual是在父类肯定有进行申明,但是函数是没有本体的。相当于一个接口允许子类进行同名化也是方便子类函数的继承更方便!~两个不同定义的子类可以通过同一个过程调用不同的函数,一般都是通过Virtual来定义的!~...

c#中virtual, abstract和override的区别和用法?
virtual是把一个方法声明为虚方法,使派生类可重写此方法,一般建立的方法是不能够重写的,譬如类A中有个方法\\x0d\\x0aprotected void method(){\\x0d\\x0a 原代码...;\\x0d\\x0a}\\x0d\\x0a类B继承自类A,类B能够调用类A的method()方法,但不能更改方法体代码,但当类A中使用了virtual...

virtual、sealed、override和abstract的区别有哪些?
【答案】:virtual申明虚方法的关键字,说明该方法可以被重写 sealed说明该类不可被继承 override重写基类的方法 abstract申明抽象类和抽象方法的关键字,抽象方法不提供实现,由子类实现,抽象类不可实例化。

c#中virtual、override、new的区别
  【区别】virtual与abstract virtual:用于父类中声明该方法可被重写。 abstract:只能用在抽象类中声明抽象方法,本身不能实现任何功能(因此必须在子类中override),不能实例化。 两者除了在子类中同样可以用override重写这个相同点之外,没有其他关系。 

c#中virtual, abstract和override的区别和用法?
Virtual关键字又是和override紧密不可分的,如果要实现Virtual方法就必须要使用 override或new关键字(new和override产生的机理不同)。总结:New关键字主要用来区别派生类和基类同名方法的选择问题,通过隐藏基类方法,达到使编译器调用正确的方法的目的。Override主要用来对基类的方法和虚方法进行重写。

C#中的virtual和override关键字
对于属性、事件和索引器,`virtual`和`override`的概念同样适用。例如,只读属性可以通过这两个关键字实现不同级别的访问和重写。下面是一个只读属性的例子:只读属性的`virtual`和`override`用法:运行结果:只读属性的重写规则遵循与方法相同的逻辑。总的来说,`virtual`和`override`在C#中是实现多态和...

C#中Virtual与override分别有什么用途
Virtual用在父类中表示该方法或属性可以在子类中重写,override用在子类中表示重写父类的方法或属性

c#中,override和virtual不能同时修饰么?
不可以.两个的含义完全不同.virtual 关键字用于修饰方法、属性、索引器或事件声明,并且允许在派生类中重写这些对象。例如,此方法可被任何继承它的类重写。override 方法提供从基类继承的成员的新实现。 由 override 声明重写的方法称为重写基方法。 重写的基方法必须与 override 方法具有相同的签名。不能...

C#中Virtual与override分别有什么用途
virtual 修饰符不能与 static、abstract, private 或 override 修饰符一起使用。和抽象方法的相同点是都用了override关键字进行重写方法,不同点是抽象方法必须存在于抽象类中,而子类必须重写,除非子类也是抽象的。override 方法提供从基类继承的成员的新实现。由 override 声明重写的方法称为重写基方法。...

相似回答