所以我寫了一個小的 C 類如下:
class bad_hmean : public std::logic_error {
const char *nature_;
char *what_;
public:
bad_hmean(const char *fname);
~bad_hmean() { delete[] what_; }
const char *what() { return what_; }
};
inline bad_hmean::bad_hmean(const char *fname):nature_("BAD HARMONIC MEAN VALUES"), std::logic_error("BAD HARMONIC MEAN VALUES")
{
int len = strlen(fname) strlen(nature_) 3;
what_ = new char [len];
strcpy(what_, fname);
strcat(what_, ": ");
strcat(what_, nature_);
}
我已經嘗試在以下主要內容中對其進行測驗:
void fun1() { throw bad_hmean(__func__); }
int main()
{
try
{
fun1();
} catch(std::exception& e)
{
std::cout << e.what();
}
}
當我運行它時,我遇到了一個無法解決的問題。即使我按值拋出例外并按參考捕獲它,切片仍然會發生,因為我的代碼的輸出是:BAD HARMONIC MEAN VALUES。但是,如果我捕獲例外作為對 bad_hmean 的參考,則輸出就是我想要的: fun1: BAD HARMONIC MEAN VALUES。
有誰知道為什么會這樣?
uj5u.com熱心網友回復:
bad_hmean沒有正確覆寫 what()。它應該與基類的簽名匹配what為:
const char *what() const noexcept { return what_; }
// ^^^^^ ^^^^^^^^
順便說一句:最好使用override說明符(C 11 起)來確保函式覆寫基類中的虛函式。例如
const char *what() const noexcept override { return what_; }
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/324116.html
