这个头文件的意思是什么?(virtual const char* what() const throw())

17
class myexception: public exception
{
  virtual const char* what() const throw()
  {
    return "My exception happened";
  }
};
抱歉,这个问题可能听起来很蠢,但我在解析标题时遇到了麻烦。有人能用英语描述一下标题实际上是什么意思吗?我觉得第一件奇怪的事情是关键字virtualmyexception类不是基类,而是继承自已经实现的exception类,所以为什么要在这里使用virtual?我想const是用于返回类型,它是一个c风格的字符串,是常量,另一个const是为了确保无法修改此对象的任何内容(可以告诉我那个对象是什么吗?)。我不知道throw()具体做什么,以前从未见过这种语法。

1
虚拟常量字符* what() 允许在从 myexception 派生的类中重写 what() 方法。 - Jay
1
只要您从它派生另一个类,这就是一个基类。 - David Heffernan
2
http://www.gotw.ca/publications/mill22.htm - David Heffernan
1
@πάνταῥεῖ:是的... noexcept 的意思是 throw()。来自 cppreference 的解释:"noexcept 是 throw() 的改进版本,在 C++11 中 throw() 已被弃用。与 throw() 不同,noexcept 不会调用 std::unexpected 并且可能不会展开堆栈,这潜在地允许编译器在没有 throw() 运行时开销的情况下实现 noexcept。" - Lightness Races in Orbit
1
https://dev59.com/SG435IYBdhLWcg3wvy-_ - silentNinJa
显示剩余6条评论
2个回答

32

虚函数

因为被覆盖的方法已经是虚函数,所以添加virtual关键字并不会有任何变化。你是正确的:可以省略。

const char* what()

一个成员函数名为what(),不带参数并返回指向const char的指针。

const

该成员函数可以通过对该类或派生类实例的const指针或引用进行调用。

throw()

不会抛出任何异常。


1
"

virtual关键字是可选的(您可以跳过它或明确写下-没有区别),当您覆盖来自基类的已经虚拟的方法时(就像在这种情况下)。关于两个const关键字的评论几乎是正确的。这是基本的C++。

"

3
在所指定的情况下并非如此。 - user207421
更确切地说,我们不知道在代码中是否存在指向myexception的指针,这些指针可能指向myexception子类的实例。 - ciamej
3
你完全没有抓住重点。在基类中,这个方法已经是虚拟的了,所以在这里添加虚拟关键字没有任何作用。 - user207421
但是 throw() 是做什么的?通常什么情况下可以将另一个方法放在头文件中? - user3435009
2
@ciamejпјҡжІЎжңүеҢәеҲ«пјҢеӣ дёәstd::exceptionе·Із»ҸжңүдәҶдёҖдёӘиҷҡжӢҹзҡ„what()гҖӮиҝҷдёӘиҷҡжӢҹжҖ§е·Із»Ҹ被继жүҝдәҶгҖӮеңЁиҝҷйҮҢеҶҚж¬ЎеҶҷе…ҘжҳҜеӨҡдҪҷзҡ„гҖӮ - Lightness Races in Orbit
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接