前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ 和 Java 中的默认虚拟行为有何不同及其异常处理的比较

C++ 和 Java 中的默认虚拟行为有何不同及其异常处理的比较

作者头像
鲸落c
发布2022-11-14 16:41:05
9150
发布2022-11-14 16:41:05
举报
文章被收录于专栏:鲸落学习笔记鲸落学习笔记

theme: channing-cyan highlight: a11y-dark


「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

一、C++ 和 Java 中的默认虚拟行为有何不同

方法的默认虚拟行为在 C++ 和 Java 中是相反的:

在 C++ 中,类成员方法默认是非虚拟的。可以使用virtual关键字将它们设为虚拟。例如,Base::show() 在以下程序中是非虚拟的,并且程序打印 “Base::show() called”

代码语言:javascript
复制
#include<iostream>

using namespace std;

class Base {
public:	
    void show() {
        cout<<"Base::show() called";
    }
};

class Derived: public Base {
public:	
    void show() {
        cout<<"Derived::show() called";
    }	
};

int main()
{
Derived d;
Base &amp;b = d;
b.show();
getchar();
return 0;
}

Base::show() 的定义之前添加virtual使程序打印 “Derived::show() called”****

在 Java 中,方法默认是虚拟的,可以通过使用final关键字使其成为非虚拟的。例如,在下面的java程序中,show() 默认是虚拟的,程序打印 “Derived::show() called”

代码语言:javascript
复制
class Base {

    public void show() {
    System.out.println("Base::show() called");
    }
}

class Derived extends Base {
    public void show() {
    System.out.println("Derived::show() called");
    }
}

public class Main {
    public static void main(String[] args) {
        Base b = new Derived();;
        b.show();
    }
}

与 C++ 非虚拟行为不同,如果我们在Base 中的 show() 定义之前添加final,那么上述程序将无法编译。**

二、C++ 和 Java 中异常处理的比较

两种语言都使用trycatchthrow关键字进行异常处理,并且trycatchfree块的含义在两种语言中也相同。以下是 Java 和 C++ 异常处理之间的差异。

1) 在 C++ 中,所有类型(包括原始类型和指针)都可以作为异常抛出。但是在 Java 中,只有可抛出对象(Throwable 对象是 Throwable 类的任何子类的实例)可以作为异常抛出。例如,以下类型的代码适用于 C++,但类似的代码不适用于 Java。

代码语言:javascript
复制
#include <iostream>
using namespace std;
int main()
{
int x = -1;

try {
    if( x < 0 )
    {
        throw x;
    }
}
catch (int x ) {
    cout << "发生异常:抛出的值为" << x << endl;
}
getchar();
return 0;
}

输出: 发生异常:抛出的值为 -1

2) 在 C++ 中,有一个称为“catch all”的特殊捕获,可以捕获所有类型的异常。

代码语言:javascript
复制
#include <iostream>
using namespace std;
int main()
{
int x = -1;
char *ptr;
    
ptr = new char[256];
    
try {
    if( x < 0 )
    {
        throw x;
    }	
    if(ptr == NULL)
    {
        throw " ptr is NULL ";
    }
}
catch (...) // catch all
{
    cout << "发生异常:退出"<< endl;
    exit(0);
}
    
getchar();
return 0;
}

输出: 发生异常:退出

在 Java 中,出于所有实际目的,我们可以捕获 Exception 对象来捕获所有类型的异常。因为,通常我们不会捕获除了异常(错误)之外的 Throwable(s)

代码语言:javascript
复制
catch(Exception e){
…….
}

3) 在Java中,有一个称为finally的块,它总是在try-catch块之后执行。此块可用于执行清理工作。C++ 中没有这样的块。

代码语言:javascript
复制
class Test extends Exception { }

class Main {
public static void main(String args[]) {

    try {
        throw new Test();
    }
    catch(Test t) {
        System.out.println("得到测试异常");
    }
    finally {
        System.out.println("在 finally 块里");
    }
}
}

输出:

代码语言:javascript
复制
得到测试异常
在 finally 块里

4) 在 C++ 中,所有异常都是未经检查的。在 Java 中,有两种类型的异常 - 已检查和未检查。

5) 在Java中,新关键字throws用于列出函数可以抛出的异常。在 C++ 中,没有throws关键字,同样的关键字throw也用于此目的。

6) 在 C++ 中,如果没有捕获到异常,则异常处理子系统会调用函数 unknown(),它会异常终止程序或应用程序。如果在我们的 C++ 程序中出现任何异常,那么查找该特定异常将非常耗时,因为在 C++ 中unexpected() 并没有告诉我们异常发生在哪种类型和哪一行。

但是在 Java 中,如果系统生成的异常没有被捕获,那么 Java 运行时系统 (JVM) 会将异常对象移交给默认的异常处理程序,它基本上会打印名称、描述以及异常发生在哪一行。因此在 Java 中查找和处理异常比在 C++ 语言中更容易。

如果你发现任何不正确的内容,或者你想分享有关上述主题的更多信息,请发表评论。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-11-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、C++ 和 Java 中的默认虚拟行为有何不同
  • 二、C++ 和 Java 中异常处理的比较
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档