What is the difference between an abstract method and a virtual method?
Solution 1:
An abstract function cannot have functionality. You're basically saying, any child class MUST give their own version of this method, however it's too general to even try to implement in the parent class.
A virtual function, is basically saying look, here's the functionality that may or may not be good enough for the child class. So if it is good enough, use this method, if not, then override me, and provide your own functionality.
Solution 2:
An abstract function has no implemention and it can only be declared on an abstract class. This forces the derived class to provide an implementation.
A virtual function provides a default implementation and it can exist on either an abstract class or a non-abstract class.
So for example:
public abstract class myBase
{
//If you derive from this class you must implement this method. notice we have no method body here either
public abstract void YouMustImplement();
//If you derive from this class you can change the behavior but are not required to
public virtual void YouCanOverride()
{
}
}
public class MyBase
{
//This will not compile because you cannot have an abstract method in a non-abstract class
public abstract void YouMustImplement();
}
Solution 3:
- Only
abstract
classes can haveabstract
members. - A non-
abstract
class that inherits from anabstract
class mustoverride
itsabstract
members. - An
abstract
member is implicitlyvirtual
. - An
abstract
member cannot provide any implementation (abstract
is calledpure virtual
in some languages).
Solution 4:
You must always override an abstract function.
Thus:
- Abstract functions - when the inheritor must provide its own implementation
- Virtual - when it is up to the inheritor to decide
Solution 5:
Abstract Function:
- It can be declared only inside abstract class.
- It contains only method declaration not the implementation in abstract class.
- It must be overridden in derived class.
Virtual Function:
- It can be declared inside abstract as well as non abstract class.
- It contains method implementation.
- It may be overridden.