虚函数跟抽象函数的用法及区别

gengchenhui 2011-03-14 11:36:35
RT,这个问题期待大家的回答,现在的编程还是面向实现,不过我想学习怎么面向抽象,面向接口编程。。。

ps:期待sp来回答,不过这个问题好像太宽泛了,不知道sp会不会来回答。。。
...全文
460 点赞 收藏 18
写回复
18 条回复
Dobzhansky 2011年03月14日
c++ 那边学习的时候 , 讲解实现时, 说到 的虚函数表机制挺能帮助理解的.
你自己不去搞明白, 何时也不明白.
触类旁通,

知识是融合来的, 不是孤立存在的.

回复 点赞
裸奔在上海 2011年03月14日
[Quote=引用 2 楼 vrhero 的回复:]
啥叫虚函数?啥叫抽象函数?弄清楚这两个词你就明白了...

C#中的规则是...

虚方法可被任何派生类重写,此外没有任何限制...

而抽象方法是隐式的虚方法,是有限制的虚方法...1.不允许实现;2.只允许在抽象类中声明;3.必须通过派生类实现...

这个问题其实跟什么“面向抽象,面向接口”没多大关系,仅仅是语法层面的东西...如果非得讲的深刻点,那就是虚方法是预置可重配置件……
[/Quote]

学习了。呵呵
回复 点赞
hztltgg 2011年03月14日
[Quote=引用 5 楼 gengchenhui 的回复:]
引用 3 楼 hztltgg 的回复:

虚函数是有实现的并明确允许子类去覆盖,但子类也可不覆盖

抽象函数是没有实现的子类要是具体类,一定要实现


难道你没有实际开发经验?那单纯的数学里也有抽象的概念,形状类可以定义一个得到面积的抽象函数,派生的三角形类,圆形类等实现这个得到面积的函数。

不是没有开发经验,是现在都是面向实现,这些东西都没用过,不知道什么时候该用什么。
[/Quote]

这些都是多态的范畴,你在考虑具体实现不同而又想同样处理的时候就可以用了,比如,考试,有选择题,判断题,题目打分具体方式不同,在出卷的时候就不考虑这些不同,用个抽象的方法实现出题,判断等方法,这样生成试卷的时候就方便多了,具体的实现让具体的体型类去做
回复 点赞
ZengJerry 2011年03月14日
虚函数和抽象函数都可以在子类中被override
1.虚函数可以有默认的实现,在子类中可被override也可不需要override
2.抽象函数必须在子类中被实现

什么时候使用抽象方法、接口?接口应该是相对于抽象类来说的。
回复 点赞
wanghui0380 2011年03月14日
这问题没答案

主要看你在的位置,这个题要说一定要有个答案那就一句话“屁股决定脑袋”

你座在那张椅子上,就思考那个位置改干的事情,主要就是看你是制定规则的人,还是使用规则的人

回复 点赞
vrhero 2011年03月14日
[Quote=引用 2 楼 vrhero 的回复:]
虚方法是预置可重配置件,抽象方法只是个规格说明...
[/Quote]
你看不懂这句话?

你需要别人怎么做却不知道自己怎么做就用抽象方法,你知道自己怎么做也允许别人自己做就用虚方法...

比如DbConnection.Open方法是抽象方法,因为没人知道事先该干什么...而object.ToString方法是虚方法,因为什么都不做不好...
回复 点赞
xiehuanxie 2011年03月14日
有了Interface之后, 抽象函数应用得很少, 很少遇到必须用抽象方法的情况。
回复 点赞
gengchenhui 2011年03月14日
[Quote=引用 3 楼 hztltgg 的回复:]

虚函数是有实现的并明确允许子类去覆盖,但子类也可不覆盖

抽象函数是没有实现的子类要是具体类,一定要实现


难道你没有实际开发经验?那单纯的数学里也有抽象的概念,形状类可以定义一个得到面积的抽象函数,派生的三角形类,圆形类等实现这个得到面积的函数。
[/Quote]
不是没有开发经验,是现在都是面向实现,这些东西都没用过,不知道什么时候该用什么。
回复 点赞
gengchenhui 2011年03月14日
[Quote=引用 2 楼 vrhero 的回复:]

啥叫虚函数?啥叫抽象函数?弄清楚这两个词你就明白了...

C#中的规则是...

虚方法可被任何派生类重写,此外没有任何限制...

而抽象方法是隐式的虚方法,是有限制的虚方法...1.不允许实现;2.只允许在抽象类中声明;3.必须通过派生类实现...

这个问题其实跟什么“面向抽象,面向接口”没多大关系,仅仅是语法层面的东西...如果非得讲的深刻点,那就是虚方法是预置可重配置……
[/Quote]
那构思抽象类的时候什么时候用抽象方法,什么时候用虚方法呢?
回复 点赞
hztltgg 2011年03月14日
虚函数是有实现的并明确允许子类去覆盖,但子类也可不覆盖

抽象函数是没有实现的子类要是具体类,一定要实现


难道你没有实际开发经验?那单纯的数学里也有抽象的概念,形状类可以定义一个得到面积的抽象函数,派生的三角形类,圆形类等实现这个得到面积的函数。
回复 点赞
vrhero 2011年03月14日
啥叫虚函数?啥叫抽象函数?弄清楚这两个词你就明白了...

C#中的规则是...

虚方法可被任何派生类重写,此外没有任何限制...

而抽象方法是隐式的虚方法,是有限制的虚方法...1.不允许实现;2.只允许在抽象类中声明;3.必须通过派生类实现...

这个问题其实跟什么“面向抽象,面向接口”没多大关系,仅仅是语法层面的东西...如果非得讲的深刻点,那就是虚方法是预置可重配置件,抽象方法只是个规格说明...
回复 点赞
gengchenhui 2011年03月14日
没人来回答啊?
回复 点赞
IE11下面经常卡到爆 2011年03月14日
[Quote=引用 3 楼 hztltgg 的回复:]
虚函数是有实现的并明确允许子类去覆盖,但子类也可不覆盖

抽象函数是没有实现的子类要是具体类,一定要实现


难道你没有实际开发经验?那单纯的数学里也有抽象的概念,形状类可以定义一个得到面积的抽象函数,派生的三角形类,圆形类等实现这个得到面积的函数。
[/Quote]

学习面向对象可以先抛开语法层面的东西,结合现实理解原理层的东西,还有UML也很重要,接着你应该可以做一些简单的设计,不然很有可能越来越迷惑
回复 点赞
友林 2011年03月14日
为啥要有面向对象,为啥要面向接口编程,为啥要对扩展开放,对修改关闭。其实都是为了规范,正所谓没有规矩不成方圆,不要大家都乱糟糟的各写各的代码。
回复 点赞
友林 2011年03月14日
问题不简单,就是太泛了,有些知识还是多看看书。
比如设计模式方面的。
回复 点赞
gengchenhui 2011年03月14日
看来是我问的问题太简单了。。。
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.4w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告