我即将创建一个异常类层次结构,概念上看起来有点像这样:
#include <iostream>
#include <stdexcept>
class ExceptionBase : public std::runtime_error {
public:
ExceptionBase( const char * msg ) : std::runtime_error(msg) {}
};
class OperationFailure : virtual public ExceptionBase {
public:
using ExceptionBase::ExceptionBase;
};
class FileDoesNotExistError : virtual public ExceptionBase {
public:
using ExceptionBase::ExceptionBase;
};
class OperationFailedBecauseFileDoesNotExistError
: public OperationFailure, FileDoesNotExistError {
public:
using ExceptionBase::ExceptionBase; // does not compile
};
int main() {
OperationFailedBecauseFileDoesNotExistError e("Hello world!\n");
std::cout << e.what();
}
所有的构造函数都应该和
ExceptionBase
类的构造函数一样。派生异常只有类型不同,除此之外没有其他的功能增加。以上代码中提到的最后一个异常类型也应该有这些构造函数。使用C++11标准的继承构造函数特性是否可以实现这一点?如果不可能,还有哪些替代方案?(顺便说一句:在上面的代码中,
OperationFailure
和 FileDoesNotExistError
类在gcc 4.8下无法编译,但在clang 3.4下可以编译通过。显然,gcc拒绝为虚基类继承构造函数。很有趣的是,两个编译器都拒绝了OperationFailedBecauseFileDoesNotExistError
类,因为继承构造函数没有从直接基类继承。)
using OperationFailure::OperationFailure
?但是由于双重继承的原因,可能不起作用。 - Albert