目前在我的项目中,我正在创建一个虚拟抽象基类和三个派生类。在基类中,在派生类中使用纯虚函数来创建一个方程式,该方程式将使用两个变量进行加或减。我的问题是我还必须包含一个函数来检查放入函数的变量之一是否为负数,如果是,则抛出异常。目前我将这些函数和异常放入派生类中,但对我来说似乎有点多余。所以我想知道是否允许函数检查以查看我检查的变量是否为负数并且在抽象基类中都抛出了异常?
答案 0 :(得分:2)
只需按合约模式使用通常的编程:制作 纯虚函数私有,并提供非虚拟 功能检查前后条件并调用虚拟。 类似的东西:
class C
{
virtual double doCalculate( double n ) = 0;
public:
double calculate( double n ) {
if ( n < 0.0 )
throw whatever();
return doCalculate( n );
}
};
答案 1 :(得分:1)
是的,抽象类可以从其函数中抛出异常。你应该记住那个
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
仅允许int
和double
。 - 结束例子] 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
}
- 结束示例]
答案 2 :(得分:0)
是的,你可以这样做。
在基类中,您需要有两组函数:
在基类的公共非虚函数中,您可以进行任何必要的参数检查,例如:确保论证不是负面的。必要时抛出异常。然后,如果参数检查通过,则调用相应的虚函数让派生类完成剩下的工作。
另外,请注意,如果负数对函数的参数没有意义,那么对这些参数使用无符号类型可能更简单。