我可以让虚拟抽象类抛出一个异常吗?



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

只需按照合同模式使用通常的编程:纯虚拟功能私有,并提供非虚拟功能功能以检查前后条件并调用虚拟的功能。类似:

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

是的,抽象类可以从其功能中抛出异常。但是,您应该牢记

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。 - 结束示例] 类似的限制适用于分配和初始化 指示功能,指示成员功能以及引用 功能:目标实体至少应允许例外 由分配或初始化中的源值允许。[ 示例:

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
}

- 结束示例]

是的,您可以做到。

在基类中,您需要有两组功能:

  • 班级用户将调用的公共,非虚拟功能。
  • 受派生类将实现的受保护的纯虚拟函数。

在基类的公共非虚拟函数中,您可以进行任何必要的参数检查,例如确保论点不是负面的。根据需要提出异常。然后,如果参数检查通过,请调用相应的虚拟函数让派生的类完成其余部分。


另外,请注意,如果负数对您的函数的论点没有意义,那么仅对这些参数使用未签名类型可能会很简单。

相关内容

最新更新