我明白要正确地使用多重继承来捕获异常,需要使用虚拟继承。 我并不一定支持有争议的多重继承使用,但我不想设计使其使用成为不可能的系统。 请不要从这个问题转移话题去支持或攻击多重继承的使用。
假设我有以下基本异常类型:
如何从
我的问题在于构造异常类型。理想情况下,每个异常只需要构造其父级即可,但由于虚继承的存在,这是不可能的。一种解决方法是构造链中的每个父级:
但这似乎非常重复且容易出错。此外,这使得异常类型的构造函数无法在传递到各自的父级之前添加/更改由其子级传递的信息。
假设我有以下基本异常类型:
class BaseException : public virtual std::exception {
public:
explicit BaseException(std::string msg)
: msg_storage(std::make_shared<std::string>(std::move(msg))) { }
virtual const char* what() const noexcept { return msg_storage->c_str(); }
private:
// shared_ptr to make copy constructor noexcept.
std::shared_ptr<std::string> msg_storage;
};
如何从
BaseException
创建一个正确的异常层次结构?
我的问题在于构造异常类型。理想情况下,每个异常只需要构造其父级即可,但由于虚继承的存在,这是不可能的。一种解决方法是构造链中的每个父级:
struct A : public virtual BaseException {
explicit A(const std::string& msg) : BaseException(msg) { }
};
struct B : public virtual A {
explicit B(const std::string& msg, int code)
: BaseException(msg), A(msg), code_(code) { }
virtual int code() const { return code_; }
private:
int code_;
};
struct C : public virtual B {
explicit C(const std::string& msg, int code)
: BaseException(msg), A(msg), B(msg, code) { }
};
但这似乎非常重复且容易出错。此外,这使得异常类型的构造函数无法在传递到各自的父级之前添加/更改由其子级传递的信息。
std::exception
或BaseException
的异常,并根据抛出的异常类型采取不同的行动? - Christian Hackl