【发布时间】:2013-10-24 08:16:32
【问题描述】:
我即将创建一个异常类层次结构,它在概念上看起来有点像这样:
#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 类,因为继承的构造函数不是从直接基类继承的。)
【问题讨论】:
-
钻石继承?甜蜜。
-
乐趣始于 3、2、1...
-
也许您需要使用
using OperationFailure::OperationFailure?但可能由于双重继承,它不会起作用。 -
在创建对象(使用参数化 ctor)时,即使是最近的 g++4.9 也无法编译
OperationFailure。当用非虚拟替换虚拟继承时,它可以工作。我建议您为 gcc 提交错误报告,因为我在标准中找不到任何禁止这样做的内容,而最新提案 N2540 明确允许这样做。 -
我会提交错误报告。
标签: c++ c++11 virtual-inheritance inheriting-constructors