不明白为什么这个 class 被认为是抽象的 class
Don't understand why this class is considered as abstract class
我有以下 classes:
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);
我收到此错误消息:
不允许抽象 class 类型 "EuropeanCall" 的对象
我不明白为什么编译器将 EuropeanCall 视为抽象 class。请帮忙?
函数
virtual double price(double rate, const OptionPricer& optionPricer) const = 0;
是纯虚函数,因此classes是抽象的。您不能使用纯虚函数实例化 class 的实例。
您尝试的覆盖与此函数签名不匹配;
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.
您声明:
virtual double price(double rate, const OptionPricer& optionPricer) const = 0;
在你的基础 class 但在你的衍生 class:
中得到了错误的参数
double price(const OptionPricer& optionPricer, double rate) const;
这不被视为覆盖。
If some member function vf is declared as virtual in a class Base, and
some class Derived, which is derived, directly or indirectly, from
Base, has a declaration for member function with the same
name
parameter type list (but not the return type)
cv-qualifiers
ref-qualifiers
Then this function in the class Derived is also virtual (whether or
not the keyword virtual is used in its declaration) and overrides
Base::vf (whether or not the word override is used in its
declaration).
从 C++11 开始,您可以使用 override 说明符来确保函数确实是虚函数,并且正在覆盖基类 class.
中的虚函数
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
};
我有以下 classes:
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);
我收到此错误消息: 不允许抽象 class 类型 "EuropeanCall" 的对象
我不明白为什么编译器将 EuropeanCall 视为抽象 class。请帮忙?
函数
virtual double price(double rate, const OptionPricer& optionPricer) const = 0;
是纯虚函数,因此classes是抽象的。您不能使用纯虚函数实例化 class 的实例。
您尝试的覆盖与此函数签名不匹配;
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.
您声明:
virtual double price(double rate, const OptionPricer& optionPricer) const = 0;
在你的基础 class 但在你的衍生 class:
中得到了错误的参数double price(const OptionPricer& optionPricer, double rate) const;
这不被视为覆盖。
If some member function vf is declared as virtual in a class Base, and some class Derived, which is derived, directly or indirectly, from Base, has a declaration for member function with the same
name
parameter type list (but not the return type)
cv-qualifiers
ref-qualifiers
Then this function in the class Derived is also virtual (whether or not the keyword virtual is used in its declaration) and overrides Base::vf (whether or not the word override is used in its declaration).
从 C++11 开始,您可以使用 override 说明符来确保函数确实是虚函数,并且正在覆盖基类 class.
中的虚函数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
};