基类捕获不捕获异常,即使它在派生类catch之前出现

Moh*_*hit 4 c++ exception

请参阅以下代码的预期流程

在这种情况下,基类异常由于其多态性而正在捕获这种预期行为.

#include <stdio.h>
#include<iostream.h>
using namespace std;
void main() {

    try {
        //throw CustomException();
        throw bad_alloc();
    }
    ///due to poly morphism base class reference will
    catch(exception &ex) {
        cout<<"Base :"<<ex.what()<<endl;
    }

    catch(bad_alloc &ex) {
        cout<<"Derieved :"<<ex.what()<<endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

产量

 bad_alloc
Run Code Online (Sandbox Code Playgroud)

但是如果我正在创建一个自定义异常,如下面的代码所示,派生类正在捕获异常,即使基类catch首先出现在catch块中:

class CustomException : exception {

public :
     CustomException() { }

     const char * what() const throw() {
         // throw new exception();
         return "Derived Class Exception !";
     }
};

void main() {
    try {
        throw CustomException();
        //throw bad_alloc();
    }
    ///due to poly morphism base class reffrence will
    catch(exception &ex) {
        cout<<"Base :"<<ex.what()<<endl;
    }

    catch(CustomException &ex) {
        cout<<"Derived :"<<ex.what()<<endl;
    }
} 
Run Code Online (Sandbox Code Playgroud)

预期产量:

Base : Derived Class Exception !
Run Code Online (Sandbox Code Playgroud)

实际产量:

Derived: Derived Class Exception !
Run Code Online (Sandbox Code Playgroud)

Mil*_*nek 10

使用class关键字声明的类的默认继承访问说明符是private.这意味着CustomException继承自exception privately.使用private继承的派生类不能绑定到对其父类的引用.

如果你继承public它会工作正常:

class CustomException : public exception // <-- add public keyword here
{
public :
     CustomException()
     {
     }

     const char * what()
     {
         return "Derived Class Exception !";
     }
};

int main()
{

    try
    {
        throw CustomException();
    }
    catch(exception &ex)
    {
        cout<<"Base :"<<ex.what()<<endl;
    }

    catch(CustomException &ex)
    {
        cout<<"Derived :"<<ex.what()<<endl;
    }
} 
Run Code Online (Sandbox Code Playgroud)

现场演示