【发布时间】:2012-11-06 19:24:14
【问题描述】:
我最近开始使用std::exception 作为我所有异常的基类。如果不将virtual 关键字放在它前面,我就无法正确覆盖what()。如果没有 virtual 关键字,它似乎总是调用基类 std::exception 的 what() 函数。
这让我有点困惑,因为我认为在覆盖函数时永远不需要将 virtual 放在函数前面(here is a post 似乎证实了这一点)。但我决定放手继续前进。
然后今天在阅读 O'Reilly 的“Safe C++”时,我发现作者还用 virtual 关键字覆盖了what()。他写...
virtual const char* what() const throw () { /* stuff */ }
他为什么要覆盖一个函数并使用virtual 关键字?只是我在上面引用的帖子中建议的“文档”吗?
【问题讨论】:
-
override会是更好的文档,因为如果您输入错误的签名会导致编译器错误,但是是的,afaik,很明显您正在覆盖它。 -
确实,在覆盖时您并不严格需要
virtual关键字。没有任何代码,我猜您的问题源于object slicing - 即您按值捕获异常:˙catch (std::exception e)。 -
@chris:
override是一个 Microsoft 特定的扩展,尽管如果它在非 Microsoft 编译器中是#defined,则它仍然可以用作文档。 -
@Chris:谢谢,所以我假设当我覆盖
what()时我并不真的需要使用virtual,而我的问题实际上是意外解决的其他问题。 -
@AdamRosenfield,它是 C++11 的一部分。
const char *what() const override {}和throw在 C++11 中已弃用,但我忘记了使用什么。也许noexcept什么的。
标签: c++ inheritance virtual