由于以下成员,编译器给出的错误无法实例化抽象类:
我该如何排序?
'double PayOff::operator ()(const double &) const' : is abstract
这是抽象类
class PayOff {
public:
virtual ~PayOff() {}
virtual double operator()(const double& spot) const = 0;
virtual std::shared_ptr<PayOff> clone() const = 0;
};
派生类是
class AsianGeometric: public PayOff{
private:
double strike;
public:
AsianGeometric(const double& strike);
virtual ~AsianGeometric(){};
virtual double asianpay()(const std::vector<double>& spot_prices) const;
virtual std::shared_ptr<PayOff> clone()const;
};
AsianGeometric::AsianGeometric(const double& strike){
this-> strike = strike;
}
double AsianGeometric::asianpay(const std::vector<double>& spot_prices) const{
unsigned num_times = spot_prices.size();
double log_sum = 0.0;
for (unsigned int i=0; i<spot_prices.size(); i++){
log_sum += log(spot_prices[i]);
}
double geom_mean = exp(log_sum/static_cast<double>(num_times));
if (geom_mean > strike) return geom_mean - strike;
else return 0;
}
std::shared_ptr<PayOff> AsianGeometric::clone()const{
return std::shared_ptr<PayOff>(new AsianGeometric(*this));
}
您知道:
virtual double operator()(const std::vector<double>& spot_prices) const;
不覆盖:
virtual double operator()(const double& spot) const = 0;
右?
为了实例化派生类AsianGeometric
,它需要对基类中的所有纯虚函数进行一些实现。
virtual double operator()(const double& spot) const = 0;
virtual std::shared_ptr<PayOff> clone() const = 0;
也就是说,类似于以下内容。
class AsianGeometric: public PayOff{
private:
double strike;
public:
AsianGeometric(const double& strike);
virtual ~AsianGeometric(){};
virtual double operator()(const double& spot) const {
// put implementation here
}
virtual std::shared_ptr<PayOff> clone() const {
// put implementation here
}
注意实现可以内联放在类体中也可以离线,没关系,重要的一点是方法签名必须完全匹配。
此外,在 C++11 中,作为一个优秀的设计器,您可以使用 override
关键字来指示您的意图是重写的编译器。这样,如果派生方法的签名与基类的签名有任何差异,则编译器会将其标记为错误。
那是
virtual double operator()(const double& spot) const ovrerride;
^^^^^^^^^