What is the difference between an abstract method and a virtual method?
Asked Answered
D

27

1720

What is the difference between an abstract method and a virtual method? In which cases is it recommended to use abstract or virtual methods? Which one is the best approach?

Dusen answered 24/12, 2008 at 14:11 Comment(3)
An abstract function has to be overridden while a virtual function may be overridden.Exceed
Virtual functions can have a default /generic implementation in the base class.Whom
The key word here is abstract; They don't exist and are just a vague idea of what the function is (method signature)Kropotkin
F
2914

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.

Faux answered 24/12, 2008 at 14:14 Comment(13)
And of course, if you override a virtual method, you can always refer to the parent method by calling base.Foo(...)Marlea
Thanks. This is a much better and easier explanation than anything in the MSDN documentation.(I had a headache after five minutes of reading this: msdn.microsoft.com/en-us/library/aa645767(v=vs.71).aspx)Piercy
Coming from Java, I was a bit perplexed why we need to make it virtual at all, until I read this: https://mcmap.net/q/45955/-practical-usage-of-virtual-functions-in-cAlysaalyse
@MeqDotNet It means if you like my implemention use me if NOT write your own better than me :)Blatt
You need to mark your parent class as abstract class too in order to force the child class to implement all abstract methods/functionsCabbagehead
This should be in the Microsoft reference library which I spent 10 minutes reading and still confused.Footgear
very nice post, but i think it's better to say "An abstract function Must have no functionality."Amaryllidaceous
Might be worth mentioning that the headache-inducing MSDN documentation on virtual referenced above by Jake was from 2003 documentation. The following MSDN link from 2013 documentation puts things a bit more plainly: msdn.microsoft.com/en-us/library/9fkccyh4.aspxGrote
Why aren't all methods virtual by default? It's not about "liking" any implementation, it's about polymorphism - or blocking possibility for any polymorphism by not marking methods as virtual, thus denying possibility to extend them.Osteoblast
@Osteoblast In C++ making a method virtual brings a cost - an instance of a derived class has to check which function to call (his own or one of his ancestors). In the SOLID principles O is OpenClosed - open for extension, closed for modification. If you want to follow that principle, you don't want someone to override your classes' methods (or even derive from them).Wilbert
Can't you make them private to close for overriding?Osteoblast
An abstract function is just like a pure virtual function in C++Merrill
very nice explanation. This should be in MSDN.Ier
O
329

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();
}
Oto answered 24/12, 2008 at 14:19 Comment(4)
Very useful to see sample code - helps make the various explanations in the answers much clearer.Krp
I rolled back the answer to the previous version: the two classes are just examples, first class will compile since it's marked as abstract, second won't. Whether MyBase inherits from some other class or not is irrelevant.Fuhrman
Doesn't your MyBase class have to implement the abstract class, somehow? I do not do this often, so I could be mistaken. I don't see that in your example.Cube
In the example above MyBase is showing what you cannot do. That is you cannot have an abstract method in a non abstract classOto
S
88
  1. Only abstract classes can have abstract members.
  2. A non-abstract class that inherits from an abstract class must override its abstract members.
  3. An abstract member is implicitly virtual.
  4. An abstract member cannot provide any implementation (abstract is called pure virtual in some languages).
Song answered 16/4, 2009 at 9:3 Comment(5)
Number 3 isn't make sense to me. I think you meant to say "A member of an abstract class is implicitly virtual" (i.e., you can provide functionality for it without having to specify that it's virtual).Elise
No, I meant precisely what I wrote. A member of an abstract class can be virtual or non-virtual. An abstract member (i.e. abstract property, abstract method) is just like a virtual method, i.e. you can override it, except that it does not carry with itself a default implementation.Song
Quoted "Abstract member is "implicitly" virtual." But I saw somewhere, someone had created abstract members by adding "virtual" keyword explicitly. Which is not necessary and infact it gave me a doubt until I read your answer.Wriest
Please include supporting references for point 4. And your post doesn't bring anything else that the previous ones didn't already.Glengarry
This is merely a bunch of statements with no explanations.Refractor
S
71

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
Sheffield answered 24/12, 2008 at 14:13 Comment(0)
C
41

Abstract Function:

  1. It can be declared only inside abstract class.
  2. It contains only method declaration not the implementation in abstract class.
  3. It must be overridden in derived class.

Virtual Function:

  1. It can be declared inside abstract as well as non abstract class.
  2. It contains method implementation.
  3. It may be overridden.
Contessacontest answered 28/5, 2014 at 7:52 Comment(0)
S
29

Abstract method: When a class contains an abstract method, that class must be declared as abstract. The abstract method has no implementation and thus, classes that derive from that abstract class, must provide an implementation for this abstract method.

Virtual method: A class can have a virtual method. The virtual method has an implementation. When you inherit from a class that has a virtual method, you can override the virtual method and provide additional logic, or replace the logic with your own implementation.

When to use what: In some cases, you know that certain types should have a specific method, but, you don't know what implementation this method should have.
In such cases, you can create an interface which contains a method with this signature. However, if you have such a case, but you know that implementors of that interface will also have another common method (for which you can already provide the implementation), you can create an abstract class. This abstract class then contains the abstract method (which must be overriden), and another method which contains the 'common' logic.

A virtual method should be used if you have a class which can be used directly, but for which you want inheritors to be able to change certain behaviour, although it is not mandatory.

Sylvan answered 16/4, 2009 at 9:3 Comment(0)
A
23

An abstract method is a method that must be implemented to make a concrete class. The declaration is in the abstract class (and any class with an abstract method must be an abstract class) and it must be implemented in a concrete class.

A virtual method is a method that can be overridden in a derived class using the override, replacing the behavior in the superclass. If you don't override, you get the original behavior. If you do, you always get the new behavior. This opposed to not virtual methods, that can not be overridden but can hide the original method. This is done using the new modifier.

See the following example:

public class BaseClass
{
    public void SayHello()
    {
        Console.WriteLine("Hello");
    }


    public virtual void SayGoodbye()
    {
        Console.WriteLine("Goodbye");
    }

    public void HelloGoodbye()
    {
        this.SayHello();
        this.SayGoodbye();
    }
}


public class DerivedClass : BaseClass
{
    public new void SayHello()
    {
        Console.WriteLine("Hi There");
    }


    public override void SayGoodbye()
    {
        Console.WriteLine("See you later");
    }
}

When I instantiate DerivedClass and call SayHello, or SayGoodbye, I get "Hi There" and "See you later". If I call HelloGoodbye, I get "Hello" and "See you later". This is because SayGoodbye is virtual, and can be replaced by derived classes. SayHello is only hidden, so when I call that from my base class I get my original method.

Abstract methods are implicitly virtual. They define behavior that must be present, more like an interface does.

Appraisal answered 16/4, 2009 at 9:13 Comment(0)
K
9

Abstract methods are always virtual. They cannot have an implementation.

That's the main difference.

Basically, you would use a virtual method if you have the 'default' implementation of it and want to allow descendants to change its behaviour.

With an abstract method, you force descendants to provide an implementation.

Kalif answered 16/4, 2009 at 9:0 Comment(0)
M
9

I made this simpler by making some improvements on the following classes (from other answers):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace TestOO
{
    class Program
    {
        static void Main(string[] args)
        {
            BaseClass _base = new BaseClass();
            Console.WriteLine("Calling virtual method directly");
            _base.SayHello();
            Console.WriteLine("Calling single method directly");
            _base.SayGoodbye();

            DerivedClass _derived = new DerivedClass();
            Console.WriteLine("Calling new method from derived class");
            _derived.SayHello();
            Console.WriteLine("Calling overrided method from derived class");
            _derived.SayGoodbye();

            DerivedClass2 _derived2 = new DerivedClass2();
            Console.WriteLine("Calling new method from derived2 class");
            _derived2.SayHello();
            Console.WriteLine("Calling overrided method from derived2 class");
            _derived2.SayGoodbye();
            Console.ReadLine();
        }
    }


    public class BaseClass
    {
        public void SayHello()
        {
            Console.WriteLine("Hello\n");
        }
        public virtual void SayGoodbye()
        {
            Console.WriteLine("Goodbye\n");
        }

        public void HelloGoodbye()
        {
            this.SayHello();
            this.SayGoodbye();
        }
    }


    public abstract class AbstractClass
    {
        public void SayHello()
        {
            Console.WriteLine("Hello\n");
        }


        //public virtual void SayGoodbye()
        //{
        //    Console.WriteLine("Goodbye\n");
        //}
        public abstract void SayGoodbye();
    }


    public class DerivedClass : BaseClass
    {
        public new void SayHello()
        {
            Console.WriteLine("Hi There");
        }

        public override void SayGoodbye()
        {
            Console.WriteLine("See you later");
        }
    }

    public class DerivedClass2 : AbstractClass
    {
        public new void SayHello()
        {
            Console.WriteLine("Hi There");
        }
        // We should use the override keyword with abstract types
        //public new void SayGoodbye()
        //{
        //    Console.WriteLine("See you later2");
        //}
        public override void SayGoodbye()
        {
            Console.WriteLine("See you later");
        }
    }
}
Malina answered 7/12, 2011 at 9:14 Comment(0)
D
6

Binding is the process of mapping a name to a unit of code.

Late binding means that we use the name, but defer the mapping. In other words, we create/mention the name first, and let some subsequent process handle the mapping of code to that name.

Now consider:

  • Compared to humans, machines are really good at searching and sorting
  • Compared to machines, humans are really good at invention and innovation

So, the short answer is: virtual is a late binding instruction for the machine (runtime) whereas abstract is the late binding instruction for the human (programmer)

In other words, virtual means:

“Dear runtime, bind the appropriate code to this name by doing what you do best: searching

Whereas abstract means:

“Dear programmer, please bind the appropriate code to this name by doing what you do best: inventing

For the sake of completeness, overloading means:

“Dear compiler, bind the appropriate code to this name by doing what you do best: sorting”.

Dia answered 13/8, 2017 at 20:6 Comment(0)
M
4

You basically use a virtual method when you want the inheritors to extend the functionality IF they want to.

You use abstract methods when you want the inheritors to implement the functionality (and in this case they have no choice)

Marlea answered 16/4, 2009 at 9:2 Comment(0)
L
4

Virtual Method:

  • Virtual means we CAN override it.

  • Virtual Function has an implementation. When we inherit the class we can override the virtual function and provide our own logic.

  • We can change the return type of Virtual function while implementing the
    function in the child class(which can be said as a concept of
    Shadowing).

Abstract Method

  • Abstract means we MUST override it.

  • An abstract function has no implementation and must be in an abstract class.

  • It can only be declared. This forces the derived class to provide the implementation of it.

  • An abstract member is implicitly virtual. The abstract can be called as pure virtual in some of the languages.

    public abstract class BaseClass
    { 
        protected abstract void xAbstractMethod();
    
        public virtual void xVirtualMethod()
        {
            var x = 3 + 4;
        }
    } 
    
Labanna answered 25/3, 2018 at 17:26 Comment(0)
F
2

I have seen in some places the abstract method is defined as below. **

"An Abstract Method must have to implement in the child class"

** I felt it is like .

It is not necessary that an abstract method has to be implemented in a child class, if the child class is also abstract ..

1)An abstract method cant be a private method. 2)An Abstract method cant be implemented in the same abstract class.

I would say ..if we are implementing an abstract class, you must have to override the abstract methods from the base abstract class. Because.. Implementing the abstract method is with override key word .Similar to Virtual method.

It is not necessary for a virtual method to be implemented in an inherited class.

                                 ----------CODE--------------

public abstract class BaseClass
{
    public int MyProperty { get; set; }
    protected abstract void MyAbstractMethod();

    public virtual void MyVirtualMethod()
    {
        var x = 3 + 4;
    }

}
public abstract class myClassA : BaseClass
{
    public int MyProperty { get; set; }
    //not necessary to implement an abstract method if the child class is also abstract.

    protected override void MyAbstractMethod()
    {
        throw new NotImplementedException();
    }
}
public class myClassB : BaseClass
{
    public int MyProperty { get; set; }
    //You must have to implement the abstract method since this class is not an abstract class.

    protected override void MyAbstractMethod()
    {
        throw new NotImplementedException();
    }
}
Frog answered 5/8, 2015 at 20:45 Comment(0)
B
2

Most of the above examples use code - and they are very very good. I need not add to what they say, but the following is a simple explanation that makes use of analogies rather than code/technical terms.

Simple Explanation - Explanation using analogies

Abstract Method

Think George W Bush. He says to his soldiers: "Go fight in Iraq". And that's it. All he has specified is that fighting must be done. He does not specify how exactly that will happen. But I mean, you can't just go out and "fight": what does that mean exactly? do I fight with a B-52 or my derringer? Those specific details are left to someone else. This is an abstract method.

Virtual Method

David Petraeus is high up in the army. He has defined what fight means:

  1. Find the enemy
  2. Neutralise him.
  3. Have a beer afterwards

The problem is that it is a very general method. It's a good method that works, but sometimes is not specific enough. Good thing for Petraeus is that his orders have leeway and scope - he has allowed others to change his definition of "fight", according to their particular requirements.

Private Job Bloggs reads Petraeus' order and is given permission to implement his own version of fight, according to his particular requirements:

  1. Find enemy.
  2. Shoot him in the head.
  3. Go Home
  4. Have beer.

Nouri al Maliki also receives the same orders from Petraeus. He is to fight also. But he is a politician, not an infantry man. Obviously he cannot go around shooting his politican enemies in the head. Because Petraeus has given him a virtual method, then Maliki can implement his own version of the fight method, according to his particular circumstances:

  1. Find enemy.
  2. Have him arrested with some BS trumped up charges.
  3. Go Home
  4. Have beer.

IN other words, a virtual method provides boilerplate instructions - but these are general instructions, which can be made more specific by people down the army heirarchy, according to their particular circumstances.

The difference between the two

  • George Bush does not prove any implementation details. This must be provided by someone else. This is an abstract method.

  • Petraeus on the other hand does provide implementation details but he has given permission for his subordinates to override his orders with their own version, if they can come up with something better.

hope that helps.

Brey answered 6/5, 2016 at 0:48 Comment(0)
F
2

Abstract function(method) :

● An abstract method is a method which is declared with the keyword abstract.

● It does not have body.

● It should be implemented by the derived class.

● If a method is abstract then the class should abstract.

virtual function(method) :

● A virtual method is the method which is declared with the keyword virtual and it can be overridden by the derived class method by using override keyword.

● It's up to the derived class whether to override it or not.

Freese answered 31/5, 2016 at 13:12 Comment(0)
F
1

The answer has been provided a number of times but the the question about when to use each is a design-time decision. I would see it as good practice to try to bundle common method definitions into distinct interfaces and pull them into classes at appropriate abstraction levels. Dumping a common set of abstract and virtual method definitions into a class renders the class unistantiable when it may be best to define a non-abstract class that implements a set of concise interfaces. As always, it depends on what best suits your applications specific needs.

Folksy answered 19/8, 2013 at 10:28 Comment(0)
G
1

Abstract function cannot have a body and MUST be overridden by child classes

Virtual Function will have a body and may or may not be overridden by child classes

Gamages answered 12/1, 2016 at 17:17 Comment(0)
S
1

From general object oriented view:

Regarding abstract method: When you put an abstract method in the parent class actually your are saying to the child classes: Hey note that you have a method signature like this. And if you wanna to use it you should implement your own!

Regarding virtual function: When you put a virtual method in the parent class you are saying to the derived classes : Hey there is a functionality here that do something for you. If this is useful for you just use it. If not, override this and implement your code, even you can use my implementation in your code !

this is some philosophy about different between this two concept in General OO

Sophocles answered 1/3, 2017 at 10:35 Comment(0)
S
1

An abstract function is "just" a signature, without an implementation. It is used in an interface to declare how the class can be used. It must be implemented in one of the derived classes.

Virtual function (method actually), is a function you declare as well, and should implemented in one of the inheritance hierarchy classes.

The inherited instances of such class, inherit the implementation as well, unless you implement it, in a lower hierarchy class.

Susie answered 27/7, 2018 at 11:7 Comment(0)
S
1

From a C++ background, C# virtual corresponds to C++ virtual, while C# abstract methods corresponds to C++ pure virtual function

Sanguinaria answered 27/10, 2018 at 6:55 Comment(0)
C
1

If a class derives from this abstract class, it is then forced to override the abstract member. This is different from the virtual modifier, which specifies that the member may optionally be overridden.

Callender answered 10/9, 2019 at 19:10 Comment(0)
U
0

There are nothing call virtual class in C#.

For functions

  1. Abstract function only have signature only,the drive class should override with functionality.
  2. Virtual function will hold the part of functionality the drive class may or may not override it according to the requirement

You can decide with your requirement.

Unmitigated answered 7/6, 2016 at 14:41 Comment(0)
B
0

Abstract method doesnt have an implementation.It is declared in the parent class. The child class is resposible for implementing that method.

Virtual method should have an implementation in the parent class and it facilitates the child class to make the choice whether to use that implementation of the parent class or to have a new implementation for itself for that method in child class.

Brisesoleil answered 5/6, 2018 at 12:38 Comment(0)
B
0

An abstract function or method is a public "operation's name" exposed by a class, its aim, along with abstract classes, is primarily provide a form of constraint in objects design against the structure that an object have to implement.

In fact the classes that inherit from its abstract class have to give an implementation to this method, generally compilers raise errors when they don't.

Using abstract classes and methods is important mostly to avoid that by focusing on implementation details when designing classes, the classes structure be too related to the implementations, so creating dependences and coupling between classes that collaborate among them.

A virtual function or method is simply a method that models a public behaviour of a class, but that we can leave free to modify it in the inheritance chain, because we think that child classes could have need to implement some specific extensions for that behaviour.

They both represent a form of polymorpfhism in object orientation paradigm.

We can use abstract methods and virtual functions together to support a good inheritance model.

We design a good abstract structure of main objects of our solution, then create basic implementations by locating those more prone to further specializations and we make these ones as virtuals, finally we specialize our basic implementations, eventyually "overriding" inherited virtual ones.

Bitterroot answered 24/2, 2019 at 0:36 Comment(0)
D
0

Here I am writing some sample code hoping this may be a rather tangible example to see the behaviors of the interfaces, abstract classes and ordinary classes on a very basic level. You can also find this code in github as a project if you want to use it as a demo: https://github.com/usavas/JavaAbstractAndInterfaceDemo

public interface ExampleInterface {

//    public void MethodBodyInInterfaceNotPossible(){
//    }
    void MethodInInterface();

}

public abstract class AbstractClass {
    public abstract void AbstractMethod();

    //    public abstract void AbstractMethodWithBodyNotPossible(){
    //
    //    };

    //Standard Method CAN be declared in AbstractClass
    public void StandardMethod(){
        System.out.println("Standard Method in AbstractClass (super) runs");
    }
}

public class ConcreteClass
    extends AbstractClass
    implements ExampleInterface{

    //Abstract Method HAS TO be IMPLEMENTED in child class. Implemented by ConcreteClass
    @Override
    public void AbstractMethod() {
        System.out.println("AbstractMethod overridden runs");
    }

    //Standard Method CAN be OVERRIDDEN.
    @Override
    public void StandardMethod() {
        super.StandardMethod();
        System.out.println("StandardMethod overridden in ConcreteClass runs");
    }

    public void ConcreteMethod(){
        System.out.println("Concrete method runs");
    }

    //A method in interface HAS TO be IMPLEMENTED in implementer class.
    @Override
    public void MethodInInterface() {
        System.out.println("MethodInInterface Implemented by ConcreteClass runs");

    //    Cannot declare abstract method in a concrete class
    //    public abstract void AbstractMethodDeclarationInConcreteClassNotPossible(){
    //
    //    }
    }
}
Defenestration answered 2/3, 2019 at 12:50 Comment(0)
D
0

Traditional threefold classification of propositions

Figure. — Traditional threefold classification of propositions.

In deontic logic (the study of obligation and permission), every proposition is obligatory (‘must’ operator), optional (‘may and may not’ operator), or impermissible (‘must not’ operator), and no proposition falls into more than one of these three categories.

Furthermore, the permissible (‘may’ operator) propositions are those that are obligatory or optional, the omissible (‘may not’ operator) propositions are those that are impermissible or optional, and the non-optional (‘must or must not’ operator) propositions are those that are obligatory or impermissible.

In particular, an obligatory proposition is permissible, and an impermissible proposition is omissible.

Applying those operators to the proposition ’the method is overridden’ yields the following propositions:

  • abstract (pure)/concrete method: the method must be overridden/may not be overridden;
  • virtual/real (final) method: the method may be overridden/must not be overridden.

In particular, an abstract method is virtual, and a real method is concrete.

Donovan answered 13/5, 2021 at 11:0 Comment(0)
T
-4

To my understanding:

Abstract Methods:

Only the abstract class can hold abstract methods. Also the derived class need to implement the method and no implementation is provided in the class.

Virtual Methods:

A class can declare these and also provide the implementation of the same. Also the derived class need to implement of the method to override it.

Thornie answered 27/6, 2011 at 15:37 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.