基类是抽象的,派生的也是抽象的?

时间:2012-05-13 09:31:26

标签: c++ oop inheritance

我有基类:

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是一个抽象类,我无法实例化它。我做错了什么?

编辑:我实现了它们,但没有在这里添加它们

2 个答案:

答案 0 :(得分:3)

您尚未实施outputless。任何未定义纯虚函数的类都无法实例化。

一个好的编译器应该向您显示更好的消息:

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 ) { ... }