Virtual和override的区别
5个回答
2013-04-12
展开全部
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分别定义的。
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分别定义的。
威孚半导体技术
2024-08-19 广告
2024-08-19 广告
威孚(苏州)半导体技术有限公司是一家专注生产、研发、销售晶圆传输设备整机模块(EFEM/SORTER)及核心零部件的高科技半导体公司。公司核心团队均拥有多年半导体行业从业经验,其中技术团队成员博士、硕士学历占比80%以上,依托丰富的软件底层...
点击进入详情页
本回答由威孚半导体技术提供
2013-04-12
展开全部
Virtusal 是虚方法啊,,,,Override这个是覆盖方法啊, 在虚方法中不能包括Overrde abstract static 等 修饰符
而在哪个覆盖的方法啊就可以,包括 new static virtual 还可以有 abstrasct
而在哪个覆盖的方法啊就可以,包括 new static virtual 还可以有 abstrasct
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
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。
2、virtual(虚拟方法)和dynamic(动态方法)表示:后代类可以override祖先的同名方法,在override过程的实现里,还可以用inherited调用祖先的同名方法,virtual(虚拟方法)和dynamic(动态方法)两者的差异在于方法指针的保存,virtual方法使用VMT(Virtual Method Table),也就是说,每一个该类的后代类都拥有整个的VMT,其优点在于速度快,因为类的实例可以直接从VMT中找到该方法的入口,但它也耗用较多的内存;相对的dynamic方法则不使用VMT,如果类的后代没有override该方法,那么需要从它的父类去查找方法的入口,它的优点是少用内存,因为子类只保留它override的方法入口,缺点是速度较慢,尤其在多级继承的时候,可能需要前溯好多层才找到方法的。
3、一般的理解是,如果该方法其后代类基本都需要override的,使用virtual,如果该方法不经常在后代类中被override的,使用dynamic。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2013-04-12
展开全部
如果一个方法想用override必须将其定义为抽象(abs..)的或虚(virtual)的
就是重新写一下,或许原来只有一个方法定义,这里是具体的实现
就是重新写一下,或许原来只有一个方法定义,这里是具体的实现
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐于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关键字必须有
(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关键字必须有
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询