制作纯虚函数是不是好的还是坏的做法?我一直认为我们不应该对它的实现类施加额外的限制,因为它实现应该没有抛出,因为这可能导致实现中的修改和不必要的try catch块以防止异常转移.我认为实现应该决定函数是否可以标记为no而不是异常规范应该决定实现?
如果我错了,有人可以纠正我吗?
noexcept不是关于实现,而是关于接口.虚拟函数表示的抽象操作是否从根本上不能失败?然后使虚函数noexcept.如果操作在理论上可能失败,即使您编写的任何实现都不能,也不会.
noexcept是成员函数规范的一部分,与返回类型,参数列表和const限定符的方式相同.它可以帮助功能的用户 - 显然,这是以功能的实现者为代价的.
如果您需要在为用户提供noexcept功能的同时为实施者提供更大的灵活性,请创建一对功能 - 非虚拟公共功能noexcept和无保护虚拟功能noexcept.使公共noexcept函数调用虚拟实现,并处理异常以将其隐藏在其调用者中:
class Base {
protected:
virtual void doSomethingImpl() = 0;
public:
void doSomething() noexcept {
try {
doSomethingImpl();
} catch(...) {
// Provide some handling here
}
}
};
class Derived : public Base {
void doSomethingImpl() {
... // Implementers have flexibility to throw here
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1523 次 |
| 最近记录: |