求教,虚函数和抽象方法效果是一样的吗?

Zhangxujiatu 2016-12-19 07:01:06
感觉两个效果一样,什么情况下用虚函数或者抽象方法呢?
...全文
166 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Zhangxujiatu 2016-12-20
  • 打赏
  • 举报
回复
引用 3 楼 Milo米啊米啊米的回复:
你的分析角度不对,这两个完全是两个不同的东西,一个是函数,一个是,怎么会一样呢。如果你只是从重载的角度来看,是的,我们都重载。但是一个是以函数为出发点来重载,一个是以类为出发点来重载。 虚函数,存在于一个具体的类中,它在这个类中有实体(也就是具体的实现),当你觉得这个已经存在的实体是你想要的的时候,你会想在子类中去重载它,你只是重载了这个函数,对这个类和类的其他方面不会有任何影响。 抽象类本身就是一个类,它包含所有的函数体都是没有实体的,而他自己也无法实例化,因为不能实例化,所以它常常用来提取多个物体的公共方法和属性,比如人,不管是男人、女人、老人还是小孩,都有年龄、身高、体重等信息,都会有吃饭、走路等动作。但是这些可能都不相同,你可以用抽象类将它们抽象出来,但不实现具体内容,然后在子类中(男人、女人、老人还是小孩)将整个类的方法根据需要进行重载。
理解了看来还是写的太少
  • 打赏
  • 举报
回复
virtual 是对应与某些人“故意不想让子类重写某些方法”时的洁癖的,asbtract 是对应于某些人“故意不想让父类被实例化、必须补充扩展内容”时的洁癖的。都是在各种实现约束上进行细化,都是详细设计实现时才需要考虑的。而在OOAD设计阶段实际上通常都假设所有的类型都能实例化、都能被子类重写,通常就不去考虑那么多“悲观约束”的东西。 在产品设计阶段,不考虑这些。而初学者有可能只能看到这些编程伎俩,而没有建立更高级的软件设计。
  • 打赏
  • 举报
回复
都是属于“实现”阶段的各种编译器、语言特性,属于编程伎俩。 在设计上,不论是class 或者 interface 之类的,都是类型,无需特别区分开来,更无需特别区分什么abstract、virtual 之类的。只有用某种编程语言实现时,才会产生七七八八的各种特性,来应对各种程序员所纠结的洁癖。但是这些程序员基于相同的基础设计知识这就足够了,所以要分出层次。 在实现上,它们有不同的规范约束,可以适合不同人的口味。而已。
闭包客 2016-12-20
  • 打赏
  • 举报
回复
引用 2 楼 Zhangxujiatu 的回复:
[quote=引用 1 楼 娃都会打酱油了的回复:]virtual虚函数,本身具体实现,但可以在子类进行重载 abstract抽象,本身具体实现,子类必须实现该方法
有没有那种情况必须用虚方法或抽象方法这个说法?我感觉都是重写,没啥具体的区别。。。。[/quote] 有很具体的区别。 如果你继承了抽象类,抽象方法不重写,是一个编译错误。
  • 打赏
  • 举报
回复
你的分析角度不对,这两个完全是两个不同的东西,一个是函数,一个是,怎么会一样呢。如果你只是从重载的角度来看,是的,我们都重载。但是一个是以函数为出发点来重载,一个是以类为出发点来重载。 虚函数,存在于一个具体的类中,它在这个类中有实体(也就是具体的实现),当你觉得这个已经存在的实体是你想要的的时候,你会想在子类中去重载它,你只是重载了这个函数,对这个类和类的其他方面不会有任何影响。 抽象类本身就是一个类,它包含所有的函数体都是没有实体的,而他自己也无法实例化,因为不能实例化,所以它常常用来提取多个物体的公共方法和属性,比如人,不管是男人、女人、老人还是小孩,都有年龄、身高、体重等信息,都会有吃饭、走路等动作。但是这些可能都不相同,你可以用抽象类将它们抽象出来,但不实现具体内容,然后在子类中(男人、女人、老人还是小孩)将整个类的方法根据需要进行重载。
enaking 2016-12-20
  • 打赏
  • 举报
回复
在c++里,抽象类的函数就相当于是纯虚函数,你把虚函数和纯虚函数区分开这个就懂了,c#还有一个叫接口,这个才是真的很多coder把接口和抽象类区分不开的。
正怒月神 2016-12-20
  • 打赏
  • 举报
回复
1,2,5楼都说的差不多了。 其实就是一种约束。 抽象类不能实例化,并且派生类必须要实现其中的抽象方法。 而虚方法是具有方法体的。派生类可以选择性的重写它。
brucel51 2016-12-20
  • 打赏
  • 举报
回复
任何一种语法概念必与现实生活中的场景有吻合的地方。
Zhangxujiatu 2016-12-19
  • 打赏
  • 举报
回复
引用 1 楼 娃都会打酱油了的回复:
virtual虚函数,本身具体实现,但可以在子类进行重载 abstract抽象,本身具体实现,子类必须实现该方法
有没有那种情况必须用虚方法或抽象方法这个说法?我感觉都是重写,没啥具体的区别。。。。
  • 打赏
  • 举报
回复
virtual虚函数,本身具体实现,但可以在子类进行重载 abstract抽象,本身具体实现,子类必须实现该方法

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧