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

> Что не так?

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

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

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

anonymous
()
Ответ на: комментарий от anonymous

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

а где написано, что оно не должно работать с множ насл?

dilmah ★★★★★
()

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

dilmah ★★★★★
()
Ответ на: комментарий от placement_new

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

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

dilmah ★★★★★
()
Ответ на: комментарий от placement_new

австралийцы предвидели это в 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 ★★★★★
()

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 ★★★★★
()
Ответ на: комментарий от dilmah

dilmah, спасибо!

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

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

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

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