C++ 和JAVA中的默认虚拟行为

C++ 和JAVA中的默认虚拟行为

C++中,默认情况下,类成员方法是非虚拟的。这意味着通过指定它们,可以使它们成为虚拟的。

另一方面,在Java中,方法默认是虚拟的,并且可以通过使用’final’关键字使其非虚拟。

让我们来看看C++和Java中方法的默认虚拟行为如何不同。需要牢记的是,在C++编程语言中,类成员方法默认是非虚拟的。通过使用virtual关键字,它们可以变成虚拟的。示例,下面的程序中,Base::show()不是虚拟的,并且程序打印”Base::show() called”。

// 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;
} 

输出

编译错误

Base :: show() called

输出的解释:在Base::show()的定义之前添加virtual使程序打印出”Derived::show() called.” 在Java中,方法默认是虚拟的,但可以使用final关键字使其变成非虚拟的。示例,在下面的Java程序中,show()默认是虚拟的,程序将打印出”Derived::show() called.”

让我们看看如果我们在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();
    }
}

输出

Derived :: show() called

请注意,与非虚拟的C++行为不同,在Base类的show()定义之前加上final关键字后,以上程序无法编译通过。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程