不明白为啥这个类被认为是抽象类

Posted

技术标签:

【中文标题】不明白为啥这个类被认为是抽象类【英文标题】:Don't understand why this class is considered as abstract class不明白为什么这个类被认为是抽象类 【发布时间】:2016-02-16 11:29:07 【问题描述】:

我有以下课程:

EuropeanOption.h

#pragma once

class OptionPricer;

class EuropeanOption

protected:

    double dividend;

    double strike;

    double vol;

    double maturity;

    double spot;

public:
    EuropeanOption(void);

    virtual ~EuropeanOption(void);

    virtual double price(double rate, const OptionPricer& optionPricer) const = 0;

    virtual short getSign() const =0;

    double getDividend() const;
    double getStrike() const;
    double getVol () const;
    double getMaturity() const;
    double getSpot() const;


    void setDividend(double dividend_);
    void setStrike(double strike_);
    void setVol(double vol_);
    void setMaturity(double maturity_);
    void setSpot(double spot_);
;

EuropeanOption.cpp

#include "OptionPricer.h"
#include "EuropeanOption.h"


EuropeanOption::EuropeanOption(void)




EuropeanOption::~EuropeanOption(void)




double EuropeanOption::getDividend() const

    return dividend;


double EuropeanOption::getMaturity() const

    return maturity;


double EuropeanOption::getStrike() const

    return strike;


double EuropeanOption::getSpot() const 

    return spot;


double EuropeanOption::getVol() const

    return vol;



void EuropeanOption::setDividend(double dividend_)

    dividend = dividend_;


void EuropeanOption::setMaturity(double maturity_)

    maturity = maturity_;


void EuropeanOption::setSpot(double spot_)

    spot = spot_;


void EuropeanOption::setVol(double vol_)

    vol = vol_;


void EuropeanOption::setStrike(double strike_)

    strike = strike_;

EuropeanCall.h

#pragma once

    #include "EuropeanOption.h"

    class EuropeanCall :
        public EuropeanOption
    

    public:
        EuropeanCall(void);
        EuropeanCall(double spot_, double strike_, double maturity_, double vol_, double dividend_ = 0);

        ~EuropeanCall(void);

        short getSign() const;
        double price(const OptionPricer& optionPricer, double rate) const;
    

;

EuropeanCall.cpp

#include "EuropeanCall.h"
#include "OptionPricer.h"
#include <cstdlib>


EuropeanCall::EuropeanCall(void)




EuropeanCall::EuropeanCall(double spot_, double strike_, double maturity_, double vol_, double dividend_)

    spot = spot_;
    strike = strike_;
    maturity = maturity_;
    vol = vol_;
    dividend = dividend_;


EuropeanCall::~EuropeanCall(void)



short EuropeanCall::getSign() const

    return 1;




double EuropeanCall::price(const OptionPricer& optionPricer, double rate) const

    return optionPricer.computePrice(*this, rate);

OptionPricer.h

#pragma once
#include "EuropeanOption.h"

class OptionPricer

public:
    OptionPricer(void);

    virtual double computePrice(const EuropeanOption& option, double rate) const =0;
    virtual ~OptionPricer(void);
;

OptionPricer.cpp

#include "OptionPricer.h"


OptionPricer::OptionPricer(void)




OptionPricer::~OptionPricer(void)


在我的主函数中,当尝试像这样实例化 EuropeanCall 时:

EuropeanCall myCall(spot,strike,maturity,vol);

我收到以下错误消息: 不允许抽象类类型“EuropeanCall”的对象

我不明白为什么编译器将 EuropeanCall 视为一个抽象类。请帮忙?

【问题讨论】:

你听说过MVCE吗? 【参考方案1】:

你声明:

virtual double price(double rate, const OptionPricer& optionPricer) const = 0;

在您的基类中,但在派生类中以错误的方式获取参数:

double price(const OptionPricer& optionPricer, double rate) const;

这不被视为覆盖。

如果某个成员函数 vf 在类 Base 中被声明为 virtual,并且 一些派生类,直接或间接派生自 Base,具有相同的成员函数声明

名字

参数类型列表(但不是返回类型)

cv 限定符

引用限定符

那么 Derived 类中的这个函数也是虚的(无论是 不是在其声明中使用关键字 virtual)并覆盖 Base::vf(无论是否在其 声明)。

从 C++11 开始,您可以使用 override 说明符来确保函数确实是虚拟的,并且正在覆盖基类中的虚拟函数。

struct A

    virtual void foo();
    void bar();
;

struct B : A

    void foo() const override; // Error: B::foo does not override A::foo
                               // (signature mismatch)
    void foo() override; // OK: B::foo overrides A::foo
    void bar() override; // Error: A::bar is not virtual
;

【讨论】:

也许是一个很好的机会来提及旨在帮助修复此类错误的 override 关键字?【参考方案2】:

功能

virtual double price(double rate, const OptionPricer& optionPricer) const = 0;

是纯虚函数,因此类是抽象的。您不能在具有纯虚函数的类的实例上进行实例化。

您尝试的覆盖与此函数签名不匹配;

double price(const OptionPricer& optionPricer, double rate) const;

参数的顺序很重要。要捕获此类问题,您可以使用 override 说明符,编译器将检查该函数是否被覆盖。

double price(const OptionPricer& optionPricer, double rate) const override;
// The override above will cause a compiler error.

【讨论】:

以上是关于不明白为啥这个类被认为是抽象类的主要内容,如果未能解决你的问题,请参考以下文章

不明白java中的泛型和抽象类有啥区别,感觉他们作用一样啊,为啥要用2种方法呢

Java面试问题

抽象类

抽象类和接口学习小结

java学习之路--简单基础的面试题

Java面向对象之抽象类,接口