虚方法与抽象方法有什么区别?

xxxxxxxxx 2006-11-01 09:23:05
public virtual void g();
public abstract void g();

虚方法与抽象方法有什么区别?他们两个都可以提供实现和不实现,对于继承的子类也都是用override。
...全文
1014 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
netskin 2006-11-02
  • 打赏
  • 举报
回复
最大的区别是 ,抽象方法只能在抽象类当中,
www_123du_com 2006-11-02
  • 打赏
  • 举报
回复
根据我的测试,public virtual void g();会引发错误"g()必须声明主体,因为它未标记abstract或extern"

也就是说,virtual是必须有主体的。

----

abstract方法是特殊的virtual方法。特殊之处:
必须包含在abstract类中;(而abstract类不可被实例化)
不能有主体;
子类必须override。
zhangzengping 2006-11-02
  • 打赏
  • 举报
回复
不懂! 学习, 接分就不想了!
widegoose 2006-11-02
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/5127/5127911.xml?temp=.1057093
lxwin01 2006-11-02
  • 打赏
  • 举报
回复
简单点说,抽象方法是需要子类去实现的.虚方法,是已经实现了,子类可以去覆盖,也可以不覆盖取决于需求.

public abstract class AUser
{
public abstract UserInfo getUser();
public virtual void Save(UserInfo info)
{
//实现保存的功能
}
}

public class UserSqlServer:AUser
{
public override UserInfo getUser()
{
//一定要实现的,抽象类只给了抽象方法
}
//假设抽象类针对SqlServer实现的功能,这里不需要实现了.
}

public class UserOracle:AUser
{
public override UserInfo getUser()
{
//一定要实现的,抽象类只给了抽象方法
}
//假设抽象类针对Oracle实现的功能
public override void Save(UserInfo info)
{
//覆盖抽象类中的Save方法
}
}
以上只是例子,真实并不这么做.


chaircat 2006-11-01
  • 打赏
  • 举报
回复
不好意思...上面说错了...
修饰抽象类的关键字才是MustInherit,修饰抽象成员的关键字是MustOverride
chaircat 2006-11-01
  • 打赏
  • 举报
回复
虚方法一般可以在父类实现,子类不重写的话就按父类的实现...
抽象方法则是在抽象父类里声明,没有实现,也就是子类必须重写,所以VB里面的关键字都叫MustInherit
liujia_0421 2006-11-01
  • 打赏
  • 举报
回复
网上找点资料吧...
股神 2006-11-01
  • 打赏
  • 举报
回复
(信誉不是一般)
oolongTea 2006-11-01
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/TopicView3.asp?id=4904182
lovvver 2006-11-01
  • 打赏
  • 举报
回复
简单的说,虚方法可以被子类override,抽象方法一定要被子类override。
在实际应用中,更能体会两者的区别。
lovvver 2006-11-01
  • 打赏
  • 举报
回复
若一个实例方法的声明中含有 virtual 修饰符,则称该方法为虚拟方法;一个虚拟方法的实现可以由派生类取代。取代所继承的虚拟方法的实现的过程称为重写该方法;在一个虚拟方法调用中,该调用所涉及的那个实例的运行时类型确定了要被调用的究竟是该方法的哪一个实现。

虚函数的限制:

1.虚函数仅适用于有继承关系的类对象, 所以只有类的成员函数才能说明为虚函数.
2.静态成员函数不能是虚函数.
3.内联函数不能是虚函数.
4构造函数不能是虚函数.
5.析构函数可以是虚函数.
lovvver 2006-11-01
  • 打赏
  • 举报
回复
抽象方法
使用abstract关键字 public abstract bool Withdraw(…);
抽象方法是必须被派生类覆写的方法。
抽象方法是可以看成是没有实现体的虚方法
如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其它一般方法

虚方法
使用virtual关键字 public virtual bool Withdraw(…);
调用虚方法,运行时将确定调用对象是什么类的实例,并调用适当的覆写的方法。
虚方法可以有实现体

110,539

社区成员

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

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

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