C ++,无法实例化抽象类错误

时间:2015-04-22 15:28:51

标签: c++

由于以下成员,编译器提供的错误无法实例化抽象类:

我该如何排序?

'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));
 }

2 个答案:

答案 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;
                                                    ^^^^^^^^^