我即将创建一个异常类层次结构,它在概念上看起来有点像这样:
#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
,因为继承构造函数不是从直接基类继承的。)