Базовый класс catch не перехватывает исключения, даже если он появляется до catch производного класса - PullRequest
0 голосов
/ 04 января 2019

Пожалуйста, смотрите ожидаемый поток ниже кода

В этом случае исключение базового класса перехватывается как ожидаемое поведение из-за его полиморфной природы.

#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;
    }
}

выход

 bad_alloc

Но если я делаю пользовательское исключение, как показано в коде ниже, производный класс перехватывает исключение, даже если базовый класс 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;
    }
} 

ожидаемый результат:

Base : Derived Class Exception !

Фактический объем производства:

Derived: Derived Class Exception !

1 Ответ

0 голосов
/ 04 января 2019

Спецификатор доступа к наследованию по умолчанию для классов, объявленных с использованием ключевого слова class, равен private. Это означает, что CustomException наследуется от exception private ly. Производный класс, использующий наследование private, не может быть привязан к ссылке на родительский класс.

Если вы унаследуете public ly, он будет работать нормально:

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;
    }
} 

Демонстрационная версия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...