VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 446|回复: 4

[已解决]自定义异常处理问题

[复制链接]
53_avatar_middle
最佳答案
0 
donate_vip 发表于 2020-8-30 10:51:54 | 显示全部楼层 |阅读模式
// 异常处理.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <exception>
#include <string>
using namespace std;

class CustomException : public exception
{
private:
        string reason;
public:
        CustomException(string reason)
        {
                this->reason = reason;
        }
        ~CustomException()
        {
                cout << "调用CustomException的析构函数" << endl;
        }
        const char* what() const throw()
        {
                return reason.c_str();
        }
};
double Division(double divisor,double dividend)
{
        if (dividend == 0)
        {
                throw CustomException("除数为零");
        }
        return divisor / dividend;
}

int main()
{
        try
        {
                cout << "结果为" << Division(8, 0) << endl;
        }
        catch (exception& exp)
        {
                cout << exp.what() << endl;
        }
}
问题:
exception异常处理类的派生类CustomException 类的声明,其中what()函数为子类与父类的同名函数
class CustomException : public exception
{
private:
        string reason;
public:
        CustomException(string reason)
        {
                this->reason = reason;
        }
        ~CustomException()
        {
                cout << "调用CustomException的析构函数" << endl;
        }
        const char* what() const throw()
        {
                return reason.c_str();
        }
};
普通函数Division声明,形参为exception给异常处理类对象
double Division(double divisor,double dividend)
{
        if (dividend == 0)
        {
                throw CustomException("除数为零");
        }
        return divisor / dividend;
}
try-catch结构,其中catch捕获的是exception对象,但是我的Division函数抛出的是CustomException类型的对象
try
{
        cout << "结果为" << Division(8, 0) << endl;
}
catch (exception& exp)
{
        cout << exp.what() << endl; // 最终调用的是CustomException中的what()函数
}
我想问的是:当CustomException子类的对象按照值传递的方式传递给exception父类对象,按道理来讲应该发生了“割去问题”,调用的应该是exception对象的what()函数,那为什么最终的结果是调用了CustomException子类的what()函数呢?
最佳答案
57_avatar_small
2020-8-31 11:44:53
原因:多态




上一篇:论坛的源码能用Visual Studio运行吗
下一篇:Spin控件能不能设置步进值
53_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-8-30 11:00:45 | 显示全部楼层
我有些疑问的是:只有进行深复制才可以使得子类同名函数覆盖父类同名虚函数,但是为什么进行简单的值传递也会发生这种事情呀?简单的值传递会发生割去问题,应该不会发生这种事情的
92_avatar_middle
最佳答案
9 
在线会员 发表于 2020-8-30 11:48:45 | 显示全部楼层
说实话,没太看懂你的问题,哈哈
53_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2020-8-30 15:05:06 | 显示全部楼层
BreakPoint 发表于 2020-8-30 11:48
说实话,没太看懂你的问题,哈哈

exception是CustomException的父类,有个函数是Division这个函数的形参是exception对象,传参采用的是值传递的方式,然而在函数体中父类对象居然可以调用子类成员函数。
57_avatar_middle
最佳答案
25 
在线会员 发表于 2020-8-31 11:44:53 | 显示全部楼层    本楼为最佳答案   
bestAnswer
原因:多态
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2023-9-28 02:29

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表