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