-5

私は基本クラスを持っています:

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 が抽象クラスであり、インスタンス化できないことをコンパイラが教えてくれることです。私は何を間違っていますか?

編集:実装しましたが、ここには追加しませんでした

4

2 に答える 2

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仮想メソッドを示す指定子(および抽象クラスのマーク) を使用しないでください。

于 2012-05-13T09:33:45.803 に答える
2

この場合、署名は異なります。

virtual bool less( CDigit *pDigit ) = 0;
virtual bool less( CObserved *pDigit )

(CObserved が CDigit に型定義されていない限り)

問題は、タイプが異なり、派生した場合にポリモーフィックに呼び出すことができないということです。これは、昇格が予想されるためです。これは有効ではありません。の定義がCExpected一致し、次のように宣言される必要があります。

virtual bool less( CDigit *pDigit ) { ... }
于 2012-05-13T09:37:59.400 に答える