c++ - 覆盖虚函数时的异常规范

标签 c++ exception virtual-functions exception-specification

考虑以下代码:


class A
{
public:
    virtual void f() throw ( int ) { }
};

class B: public A
{
public:
    void f() throw ( int, double ) { }
};

编译时,它表示派生类 B 与 A 相比有一个更宽松的抛出说明符。这有什么重要性?如果我们尝试交换它们的异常规范,例如 A::f() 抛出 int 和 double 而 B::f() 仅抛出 int,则不会出现错误。

最佳答案

  1. Don't use exception specifications in C++.与 Java 等相比,这是非常违反直觉的。
  2. 在派生类中使用更广泛的规范会破坏 LSP(里氏替换原则)。

要扩展第 2 点:A 的调用者期望只有 int 出来,但是如果您使用 B(其中,因为它是从 A 公开派生的,也意味着它可以用作 A),突然 double 也可以出来,那会破坏 A 的契约(Contract)(只有 int 被抛出)。

关于c++ - 覆盖虚函数时的异常规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2387647/

相关文章:

c++ - 对临时引用的 const 引用

c++ - 为什么我的自定义迭代器不能使用 STL 拷贝?

java - try catch 异常总是返回 null

c++ - 当非虚函数变为虚函数时,我是否应该重新编译类实现?

C++ 继承和动态库

c++ - 调用参数置换不变函数 f(i++, i++)

c++ - 与cpp中的 'Hello'比较时,为什么会打印出 'World'?

java - 关于 for 循环和异常

java - java中代码层的异常处理

c++ - 如何知道函数何时必须是虚拟的?