要继承自std::exception
而不更改用户代码,可以使用一个中间类来实现这个目标。该中间类将继承自std::exception
并提供一些额外的功能。下面是一个示例代码:
#include
#include
class MyExceptionBase : public std::exception {
public:
MyExceptionBase(const char* message) : errorMessage(message) {}
const char* what() const noexcept override {
return errorMessage;
}
virtual void additionalFunctionality() const {
// 提供额外的功能
std::cout << "Additional functionality" << std::endl;
}
private:
const char* errorMessage;
};
class MyException : public MyExceptionBase {
public:
using MyExceptionBase::MyExceptionBase; // 继承基类的构造函数
// 可以覆盖基类的函数或者添加新的函数
void additionalFunctionality() const override {
// 提供自己的额外功能
std::cout << "Additional functionality specific to MyException" << std::endl;
}
};
int main() {
try {
throw MyException("An error occurred");
}
catch (const std::exception& ex) {
std::cout << ex.what() << std::endl;
const MyException* myEx = dynamic_cast(&ex);
if (myEx) {
myEx->additionalFunctionality();
}
}
return 0;
}
在这个示例中,MyExceptionBase
类继承自std::exception
并提供了additionalFunctionality
函数。MyException
类继承自MyExceptionBase
,并可以选择覆盖additionalFunctionality
函数,以提供自己的额外功能。
在main
函数中,我们抛出了一个MyException
对象,并捕获了std::exception
引用。我们首先使用ex.what()
打印出错误信息。然后,我们使用dynamic_cast
将std::exception
引用转换为MyException
指针,以调用additionalFunctionality
函数。这样,我们就可以在不更改用户代码的情况下使用继承自std::exception
的异常类,并提供额外的功能。