【问题标题】:Can I make virtual abstract class throw an exception我可以让虚拟抽象类抛出异常吗
【发布时间】:2014-03-05 17:04:01
【问题描述】:

目前在我的项目中,我正在制作一个虚拟抽象基类和三个派生类。在派生类中使用基类的纯虚函数来创建一个方程,该方程将与两个变量相加或相减。我的问题是我还必须包含一个函数来检查放入函数中的变量之一是否为负数,如果是,则会引发异常。目前我将这些函数和异常放入派生类中,但对我来说似乎有点多余。所以我想知道是否允许将函数放入检查以查看我正在检查的变量是否为负并且在抽象基类中都抛出异常?

【问题讨论】:

    标签: c++ function class virtual abstract


    【解决方案1】:

    只需使用通常的按契约模式编程:使 纯虚函数私有,并提供非虚函数 函数检查前置条件和后置条件并调用虚拟。 类似的东西:

    class C
    {
        virtual double doCalculate( double n ) = 0;
    public:
        double calculate( double n ) {
            if ( n < 0.0 )
                throw whatever();
            return doCalculate( n );
        }
    };
    

    【讨论】:

      【解决方案2】:

      是的,抽象类可以从其函数中抛出异常。但是,您应该记住

      n3337 § 15.4/5:

      如果虚函数有异常规范,所有 任何覆盖的函数的声明,包括定义 任何派生类中的虚函数只允许异常 基类的异常规范所允许的 虚函数。 [ 例子:

      struct B {
        virtual void f() throw (int, double);
        virtual void g();
      };
      struct D: B {
        void f();
        void g() throw (int);
      };
      

      D::f 的声明格式不正确,因为它允许所有 例外,而B::f 只允许intdouble。 —结束示例] A 类似的限制适用于分配和初始化 指向函数的指针、指向成员函数的指针和对 功能:目标实体应至少允许例外情况 分配或初始化中的源值允许。 [ 示例:

      class A { /∗ ... ∗/ };
      void (*pf1)();  // no exception specification
      void (*pf2)() throw(A);
      
      void f() {
        pf1 = pf2;  // OK: pf1 is less restrictive
        pf2 = pf1;  // error: pf2 is more restrictive
      }
      

      —结束示例]

      【讨论】:

        【解决方案3】:

        是的,你可以这样做。

        在基类中,您需要有两组函数:

        • 类的用户将调用的公共非虚拟函数。
        • 将由派生类实现的受保护的纯虚拟函数。

        在基类的公共非虚函数中,您可以进行任何必要的参数检查,例如确保论点不是否定的。根据需要抛出异常。然后,如果参数检查通过,则调用相应的虚函数,让派生类完成剩下的工作。


        另外,请注意,如果负数对您的函数参数没有意义,那么只对这些参数使用无符号类型可能会更简单。

        【讨论】:

        • 通常的习惯用法是将虚函数设为私有。
        • 如果对这些值进行算术运算是有意义的,那么您确实想要unsigned(更不用说它们可能是浮点数)。
        • 确切地说,新接口的规范也不是问题的答案:每个虚函数都可以抛出,无论是公共的、私有的还是受保护的
        猜你喜欢
        • 2011-02-19
        • 2022-07-29
        • 2011-06-28
        • 1970-01-01
        • 1970-01-01
        • 2012-02-09
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        相关资源
        最近更新 更多