2012-05-13 2 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 является абстрактным классом, и я не могу создать его экземпляр. Что я делаю не так?

Edit: я их реализовать, но не добавить их здесь

+0

Да потому, что вы не определили чистые виртуальные методы ('' output' и less') в производном классе. – Vikas

+0

Я сделал, но не добавил их по ошибке :(извините –

+2

На несвязанной ноте, это ** никогда ** имеет смысл префикс ваших классов с 'C' (или любым связанным префиксом). Это« соглашение »возникло из непонимание, не более того (Microsoft использовала его, когда их компилятор еще не понимал пространства имен, чтобы устранить неоднозначность с другими классами, но даже тогда он не предназначался для использования всеми, чтобы не было потеряно значение). –

ответ

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

Чистый виртуальный, а не только виртуальный. –

+0

Да. Спасибо и обновлены. –

2

В этом случае, подписи отличаются:

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

(если CObserved не были typedefed к CDigit)

Проблема заключается в том, что типы различаются, и это не может соответствовать называть полиморфно, если получено, потому что вы ожидал бы продвижения по службе - что недействительно. Ваше определение в CExpected должен соответствовать и быть объявлен как:

virtual bool less(CDigit *pDigit) { ... } 
Смежные вопросы