Open In App

How Does Default Virtual Behavior Differ in C++ and Java?

Last Updated : 15 Jan, 2023
Improve
Improve
Like Article
Like
Save
Share
Report

Let us discuss how the default virtual behavior of methods is opposite in C++ and Java. It is very important to remember that in the C++ language class member methods are non-virtual by default. They can be made virtual by using virtual keywords. For example, Base::show() is non-virtual in following program and program prints “Base::show() called”

Example:

CPP




// C++ Program to Illustrate How
// Default Virtual Behave
// Different in C++ and Java
 
// Importing required libraries
// Input output stream
#include <iostream>
 
using namespace std;
 
// Class 1
// Superclass
class Base {
 
    // Granting public access via
    // public access modifier
public:
    // In c++, non-virtual by default
    // Method of superclass
    void show()
    {
 
        // Print statement
        cout << "Base::show() called";
    }
};
 
// Class 2
// Subclass
class Derived : public Base {
 
    // Granting public access via public access modifier
public:
    // Method of subclass
    void show()
    {
 
        // Print statement
        cout << "Derived::show() called";
    }
};
 
// Main driver method
int main()
{
    // Creating object of subclass
    Derived d;
   
    // Creating object of subclass
    // with different reference
    Base& b = d;
 
    // Calling show() method over
    // Superclass object
    b.show();
 
    getchar();
 
    return 0;
}


Output: 

Base::show() called

Output Explanation: Adding virtual before definition of Base::show() makes program print “Derived::show() called”. In Java, methods are virtual by default and can be made non-virtual by using the final keyword. For example, in the following java program, show() is by default virtual and the program prints “Derived::show() called“.

Let us see what happens in the case we use the same concept in a java programming language via the example proposed below.

Example:

Java




// Java Program to Illustrate
// How Default Virtual Behave
// Different in C++ and Java
 
// Importing required classes
import java.util.*;
 
// Class 1
// Helper class
class Base {
 
    // Method of sub class
    // In java, virtual by default
    public void show()
    {
 
        // Print statement
        System.out.println("Base::show() called");
    }
}
 
// Class 2
// Helper class extending Class 1
class Derived extends Base {
 
    // Method
    public void show()
    {
 
        // Print statement
        System.out.println("Derived::show() called");
    }
}
 
// Class 3
// Main class
public class GFG {
 
    // Main driver method
    public static void main(String[] args)
    {
 
        // Creating object of superclass with
        // reference to subclass object
        Base b = new Derived();
        ;
 
        // Calling show() method over Superclass object
        b.show();
    }
}


Output

Derived::show() called

Note: Unlike C++ non-virtual behavior, if we add final before the definition of the show() in Base, then the above program fails in the compilation.

 



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads