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关键字后,以上程序无法编译通过。