gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:10:30 27 4
gpt4 key购买 nike

考虑以下代码:


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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com