默认虚拟行为在C++和Java中有什么不同
让我们讨论一下在C++和Java中方法的默认虚拟行为如何相反。请记住,在C++语言中,类成员方法默认情况下是非虚拟的。它们可以使用 virtual 关键词使之成为虚拟方法。例如,在下面的程序中 Base::show() 是非虚拟的,程序输出 “Base::show() called” 。
示例:
// C++ Program to Illustrate How
// Default Virtual Behave
// Different in C++ and Java
// 导入所需的库
// 输入输出流
#include <iostream>
using namespace std;
// Class 1
// 超类
class Base {
// 通过公共访问修饰符授予公共访问
public:
// 在c++中默认情况下为非虚拟的
// 超类方法
void show()
{
// 语句打印
cout << "Base::show() called";
}
};
// Class 2
// 子类
class Derived : public Base {
// 通过公共访问修饰符授予公共访问
public:
// 子类方法
void show()
{
// 语句打印
cout << "Derived::show() called";
}
};
// 主驱动方法
int main()
{
// 创建子类对象
Derived d;
// 使用不同引用创建子类对象
Base& b = d;
// 在超类对象上调用show()方法
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
// 导入所需的类
import java.util.*;
// Class 1
// 辅助类
class Base {
// 子类方法
// 在Java中默认情况下为虚拟
public void show()
{
// 打印声明
System.out.println("Base::show() called");
}
}
// Class 2
// 扩展Class 1的辅助类
class Derived extends Base {
// 方法
public void show()
{
// 打印声明
System.out.println("Derived::show() called");
}
}
// Class 3
// 主类
public class GFG {
// 主驱动方法
public static void main(String[] args)
{
// 使用子类对象使用超类引用创建对象
Base b = new Derived();
;
// 在超类对象上调用show()方法
b.show();
}
}
输出:
Derived::show() called
注: 与C++的非虚拟行为不同,如果在 Base 的show()定义前添加 final 关键字,则上述程序编译失败。