gpt4 book ai didi

c++ - 为什么 C++ 标准库不对异常使用虚拟继承?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:43:02 24 4
gpt4 key购买 nike

C++标准库定义了std::runtime_error,类似于继承自std::exception,但继承不是虚拟的。这使异常层次结构的扩展变得复杂。例如下面的代码就有问题。

class sql_exception : public virtual std::exception {...};
class sql_disconnected : public virtual std::runtime_error, public virtual sql_exception {...};
void do_something() {
throw sql_disconnected();
}
void call_something() {
try {
do_something();
} catch (const std::exception& e) {
}
}

std::exception 没有被捕获,恕我直言,它应该被捕获。这可以通过各种(不必要的复杂[恕我直言])方式解决。

我相信标准应该允许这种行为,因为它不需要假设有一个很好的理由,除了“这是标准因为它是标准”。

我知道有一些与虚拟继承相关的成本,但据我所知,与堆栈展开和其余异常处理的成本相比,它可以忽略不计。

问题 1:标准库出于什么技术原因实现了此行为?

问题 2:是否考虑了扩展层次结构的问题,如果考虑了,标准对这个主题有何看法?该标准是否阻止它或有建议遵循?

最佳答案

std::runtime_error 派生 sql_disconnected 对我来说没有意义,但也从 std::runtime_error 派生 sql_exception 没有意义。恕我直言,任何 SQL 错误都应视为运行时错误。 std::runtime_error 派生自 std::exception,因此您不需要首先创建菱形层次结构,因此您不需要使用虚拟继承来解决这个问题。标准的 STL 异常都不使用虚拟继承,您的自定义异常也不应该。

class sql_exception : public std::runtime_error {...};
class sql_disconnected : public sql_exception {...};

void do_something() {
throw sql_disconnected();
}

void call_something() {
try {
do_something();
}
catch (const std::exception& e) {
}
}

关于c++ - 为什么 C++ 标准库不对异常使用虚拟继承?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40706705/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com