我有基类:
class CDigit
{
private:
int m_iDigit;
public:
CDigit()
{
m_iDigit = 0;
}
CDigit( const int digit )
{
m_iDigit = digit;
}
void setDigit( const int digit )
{
m_iDigit = digit;
}
int getDigit() const
{
return m_iDigit;
}
virtual void output(ostream &x) = 0;
virtual bool less( CDigit *pDigit ) = 0;
};
派生类
class CExpected : public CDigit
{
private:
int m_iExpFreq;
public:
CExpected() : CDigit()
{
m_iExpFreq = 0;
}
CExpected( const int dig, const int freq) : CDigit(dig)
{
m_iExpFreq = freq;
}
CExpected( const CExpected& ce)
{
m_iExpFreq = ce.m_iExpFreq;
this->setDigit( ce.getDigit() );
}
void output(ostream &x)
{
x<<this->getDigit()<<" "<<this->m_iObsFreq;
}
bool less( CObserved *pDigit )
{
if( ( pDigit->getDigit() == this->getDigit() ) && (pDigit->getObserved() == this->getObserved() ) )
return true;
else
return false;
}
...
};
问题是编译器告诉我CExpected是一个抽象类,我无法实例化它。我做错了什么?
编辑:我实现了它们,但没有在这里添加它们
答案 0 :(得分:3)
您尚未实施output
和less
。任何未定义纯虚函数的类都无法实例化。
一个好的编译器应该向您显示更好的消息:
test.cpp: In function ‘int main(int, char**)’:
test.cpp:53: error: cannot declare variable ‘c’ to be of abstract type ‘CExpected’
test.cpp:32: note: because the following virtual functions are pure within ‘CExpected’:
test.cpp:27: note: virtual void CDigit::output(std::ostream&)
test.cpp:28: note: virtual bool CDigit::less(CDigit*)
如果要使它们成为可选项,请不要使用指示纯虚拟方法的= 0
说明符(并且是抽象类的标记)。
答案 1 :(得分:2)
在这种情况下,签名不同:
virtual bool less( CDigit *pDigit ) = 0;
virtual bool less( CObserved *pDigit )
(除非CObserved被命名为CDigit)
问题在于类型不同,并且如果派生的话,它不能与多态调用匹配,因为您会期望促销 - 这是无效的。您在CExpected
中的定义需要匹配,并声明为:
virtual bool less( CDigit *pDigit ) { ... }