LINUX.ORG.RU

Множественное наследование и try/catch inderect base, C++


0

0

Составил из кода пример непонятной мне работы try/catch
По непонятной мне причине catch не срабатывает, и я получаю:

rilium@cl-t063-361cl:/tmp$ g++ test2.cpp && ./a.out
terminate called after throwing an instance of 'spectra::exceptions::allocation_error'
Aborted

Хотя если поменять catch(std::exception& ex), на 
catch(std::bad_alloc& ex) или catch(spectra::exceptions::spectra_exception& ex)

Все работает как я и ожидаю.

Что не так? И как правильно сделать такую модель работоспособной?


#include <iostream>
#include <exception>
#include <new>
namespace spectra
{
	namespace exceptions
	{	
		class spectra_exception : public std::exception
		{
		};
		
		class allocation_error : public std::bad_alloc, public spectra::exceptions::spectra_exception
		{
		public:
			virtual const char* what() const throw();
		};
		const char* allocation_error::what() const throw() { return "Not enough memory"; }
	}
}

int main()
{
	try
	{
		throw(spectra::exceptions::allocation_error());
	}
	catch(std::exception& ex)
	{
		std::cout << "Error: " << ex.what() << std::endl;
	}
}
anonymous

Re: Множественное наследование и try/catch inderect base, C++

> Что не так?

множественное наследование

> И как правильно сделать такую модель работоспособной?

убрать множественное наследование. всё просто :)

anonymous ()

Re: Множественное наследование и try/catch inderect base, C++

по моему фишка в том что твой класс двумя путями двухсмысленно наследован (не virtual) от std::exception.

dilmah ★★★★★ ()

Re: Множественное наследование и try/catch inderect base, C++

> Наследуйся виртуально и сообщи результаты

в частности std::bad_alloc должен виртуально наследоваться от std::exception, что лежит вне пределов моего влияния.

dilmah ★★★★★ ()

Re: Множественное наследование и try/catch inderect base, C++

австралийцы предвидели это в 95 году:

Doc No:X3J16/94-0179 WG21/N0566 R1
Date:
28 Feb 95
Project: Programming Language C++
Ref. Doc: X3J16/94-0179 WG21/N0566

CD Registration Ballot comments echoed these concerns:

Australia: “The exception class hierarchy should use virtual inheritance.” (R-13)

dilmah ★★★★★ ()

Re: Множественное наследование и try/catch inderect base, C++

In my opinion, the standard exception hierarchy is very poorly designed. According to the draft, a handler catching base class exception objects by reference will only catch derived class exceptions if the base class is an 'unambiguous' base class, while on the other hand, the standard exception hierarchy does not use virtual inheritance. In practice, this means that one cannot write a mix-in extended error information class which derives from the standard exception class.

- Wil

dilmah ★★★★★ ()

Re: Множественное наследование и try/catch inderect base, C++

dilmah, спасибо!

Я сам и не подумал бы что для catch может потребоваться виртуальное наследование...

Буду думать как выкрутиться =)

С уважением, Rilium.

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.