默认虚拟行为在C++和Java中有什么不同

默认虚拟行为在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 关键字,则上述程序编译失败。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程