由于以下成员,编译器提供的错误无法实例化抽象类:
我该如何排序?
'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));
}
答案 0 :(得分:5)
你知道:
virtual double operator()(const std::vector<double>& spot_prices) const;
不覆盖:
virtual double operator()(const double& spot) const = 0;
右?
答案 1 :(得分:1)
要实例化派生类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;
^^^^^^^^^