C++ 我可以让虚拟抽象类抛出异常吗

C++ 我可以让虚拟抽象类抛出异常吗,c++,function,class,virtual,abstract,C++,Function,Class,Virtual,Abstract,目前在我的项目中,我正在制作一个虚拟抽象基类和三个派生类。在基类中,在派生类中使用纯虚函数来创建一个方程,该方程将使用两个变量进行加法或减法运算。我的问题是,我还必须包含一个函数来检查放入函数的变量之一是否为负,如果为负,将引发异常。目前,我将这些函数和异常放入派生类中,但对我来说,这似乎有点多余。因此,我想知道是否允许对函数进行检查,以查看我正在检查的变量是否为负值,并在抽象基类中引发这两个异常?是的,抽象类可以从其函数中引发异常。无论如何,你应该牢记这一点 n3337§15.4/5: 如果虚

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

是的,抽象类可以从其函数中引发异常。无论如何,你应该牢记这一点

n3337§15.4/5:

如果虚拟函数具有异常规范,则所有 任何重写函数的声明,包括定义 任何派生类中的虚拟函数只允许异常 基类的异常规范所允许的 虚拟功能。[示例:

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

-[结束示例]

是的,你能做到

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

  • 类的用户将调用的公共非虚拟函数
  • 受保护的纯虚拟函数,将由派生类实现
在基类的公共非虚函数中,可以执行任何必要的参数检查,例如,确保参数不是负的。根据需要抛出异常。然后,如果参数检查通过,则调用相应的虚函数,让派生类执行其余操作



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

只需使用常规的按约定编程模式:使 纯虚拟函数专用,并提供非虚拟 函数检查前置和后置条件,并调用虚拟机。 比如:

class C
{
    virtual double doCalculate( double n ) = 0;
public:
    double calculate( double n ) {
        if ( n < 0.0 )
            throw whatever();
        return doCalculate( n );
    }
};
C类
{
虚拟双计算(双n)=0;
公众:
双计算(双n){
如果(n<0.0)
扔任何东西;
返回计算(n);
}
};

通常的习惯用法是将虚拟函数私有化。如果对值进行算术是有意义的,那么您就不需要无符号的(更不用说它们可能是浮点)。确切地说,新接口的规范也不是问题的答案:每个虚拟函数都可以抛出,无论它是公共函数,私人的还是受保护的
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
}
class C
{
    virtual double doCalculate( double n ) = 0;
public:
    double calculate( double n ) {
        if ( n < 0.0 )
            throw whatever();
        return doCalculate( n );
    }
};