2012-05-13 63 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是一个抽象类,我不能实例化。我究竟做错了什么?

编辑:我已经实现他们却没有在这里

+0

是的,因为你还没有定义的纯虚方法('output'和'less')在派生类中。 – Vikas

+0

我做了,但没有添加他们的错误:(对不起 –

+2

在一个不相关的说明,它**从来没有**是有道理的前缀类与'C'(或任何相关的前缀)。这种“约定”出现一个误解,没有更多的东西(微软在编译器还没有理解命名空间时使用了它,以便与其他类消除歧义;但即使这样也不意味着每个人都使用它,以免消除歧义) –

回答

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

纯粹的虚拟,而不仅仅是虚拟。 –

+0

是的。谢谢并更新。 –

2

在这种情况下,这两个签名不同:

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

(除非CObserved是通过typedef到CDigit)

的问题是,类型不同,如果得到的,因为你不能匹配到多态调用会期待升职 - 这是无效的。您在CExpected需求定义相匹配,并声明如下:

virtual bool less(CDigit *pDigit) { ... }