В чем смысл этого заголовка (virtual const char * what() const throw())?

class myexception: public exception
{
  virtual const char* what() const throw()
  {
    return "My exception happened";
  }
};

Извините, этот вопрос может показаться глупым, но мне сложно разобрать заголовок. Может ли кто-нибудь описать на английском языке, что на самом деле означает заголовок? Первое, что кажется странным для меня, - это ключевое слово virtual. Класс myexception не является базовым классом и наследуется от уже реализованного класса exception, поэтому зачем использовать virtual? Я предполагаю, что const предназначен для типа возвращаемого значения, который является строкой c-стиля, которая является константой, а другая const должна убедиться, что ничего не может изменить этот объект (может ли кто-нибудь сказать мне, что этот объект может быть?). Я понятия не имею, что именно делает throw(), никогда не видел этот синтаксис раньше.

Ответ 1

виртуальный

Ничего не добавляет, поскольку переопределенный метод уже является виртуальным. Вы правы: его можно опустить.

const char * what()

Функция-член с именем what() которая не принимает аргументов и возвращает указатель на const char.

Const

Функция-член может быть вызвана с помощью указателя const или ссылки на экземпляр этого класса или производного класса.

бросить()

Не исключает никаких исключений.

Ответ 2

Ключевое слово virtual является необязательным (вы можете пропустить его или явно записать - без разницы), когда вы переопределяете уже виртуальный метод из базового класса (например, в этом случае). Ваши замечания по двум ключевым словам const почти правильны. Это основной C++.

Ответ 3

Это дополнительный вопрос.

Благодаря user207421, из вашего объяснения... Функция-член может вызываться через указатель const или ссылку на экземпляр этого класса или производного класса.

Означает ли это, что what() является закрытой функцией-членом, которая также может вызываться вне класса?