2012-05-13 28 views
-4

私は、基本クラスを持っている:基本クラスは抽象クラスであり、派生クラスも抽象クラスです。

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

編集:私はそれらを実装していたが、あなたはoutputlessを実装していないここに

+0

。 – Vikas

+0

私は間違ってそれらを追加しませんでした:(申し訳ありません –

+2

関連のないメモでは、あなたのクラスに 'C'(または関連する接頭辞)の接頭辞を付けることは絶対にありません。他のクラスとの曖昧さを解消するためにコンパイラが名前空間を理解していないときにMicrosoftが使用しましたが、それでも曖昧さをなくすことができないように、誰でも使用するつもりはありませんでした)。 –

答えて

3

それらを追加しませんでした。純仮想関数が定義されていないクラスは、インスタンス化できません。あなたがそれらをオプションにしたい場合は、純粋仮想メソッドを示し(との印である= 0指定子を使用していない

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*) 

良いコンパイラはあなたのより良いメッセージが表示されるはずです抽象クラス)。この場合

+1

純粋な仮想ではなく、仮想。 –

+0

はい、ありがとう、更新されました。 –

2

、シグネチャが異なります

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

を(CObservedがCDigitにtypedefedされていない限り)

問題は種類が異なるということです、そしてあなたのために派生している場合には、多態呼び出すために一致させることはできませんプロモーションが期待されます。これは有効ではありません。 CExpectedでのあなたの定義が一致する必要がある、とのように宣言すること:あなたが派生クラスの純粋仮想メソッド( `output`と` less`)を定義していないので、はい

virtual bool less(CDigit *pDigit) { ... } 
関連する問題