یک متد abstract می تواند هیچ بدنه ای نداشته باشد. در واقع شما می گوئید، هر کلاس فرزندی خودش الزاماً باید پیاده سازی این متد را تعریف کند. یک متد virtual می گوید، نگاه کن، این پیاده سازی است که ممکن است در کلاس های فرزند بدرد بخورد و امکان هم دارد که بدرد نخورد، پس اگر بدرد می خورد از آن استفاده کنید و اگر بدرد نمی خورد خودت آنرا پیاده سازی کن. (لینک مرجع)

•    فقط متد abstract را در کلاس abstract می توان تعریف کرد.
•    متد abstract دقیقاً مثل interface است.
•    متد abstract پیاده سازی ندارد.

کی کدام؟
وقتیکه می دانیم کلاس هایی که می خواهند از کلاس پدر مشتق شوند همگی دارای متد هایی هستند که پیاده سازی آنها معلوم نیست از متد abstract استفاده می کنیم. اما اگر می دانیم که کلاس های مشتق می شوند اغلب یک پیاده سازی پیش فرض از متد را دارا هستند آنوقت آنها را بصورت virtual تعریف می نماییم.