2015-01-04 82 views
2

我對這種繼承概念有點新,我無法弄清楚什麼是錯的。 我會很樂意爲您提供一些幫助。繼承錯誤 - 無法實例化抽象類無法訪問在類中聲明的受保護的成員

所以我有三個類和一個主:

class BaseClassPipeline 
{ 
protected: 
    BaseClassPipeline::BaseClassPipeline(void){}; 
    virtual int executeFilter (SRV *p_Srv) = 0; 
    BaseClassPipeline::~BaseClassPipeline(void){}; 
}; 


class filter_A:public BaseClassPipeline 
{ 
**edit: protected and not public** 
**public:** 
    filter_A:::filter_A(void); 
    int filter_A::executeFilter (SRV *p_Srv){return 1} 
    filter_A:::~filter_A(void); 
}; 



class PipelineAttr 
{ 

protected: 
    PipelineAttr::PipelineAttr(FILE *cfgFile, SRV *p_Srv){...}; 
    BaseClassPipeline** PipelineAttr::createPipeline(FILE *cfgFile){...}; 
    int PipelineAttr::getNumOfFilters(){...}; 
    PipelineAttr::~PipelineAttr(void){...}; 
}; 



class Pipeline:public BaseClassPipeline, public PipelineAttr 
{ 
public: 
    Pipeline::Pipeline(FILE *cfgFile, SRV *p_Srv) : PipelineAttr(cfgFile, p_Srv){} 
    int Pipeline::executePipeline(SRV *p_Srv); 
    int Pipeline::countFilters(); 
    Pipeline::~Pipeline(void); 
}; 

這是主要的:

void main() 
{ 
... 
Pipeline pipe(cfgFile, srv); // trying to create instance of pipeline 
} 

我想閱讀一些其他職位,但無法弄清楚我在做什麼錯誤。

我得到這些消息:

'管道':不能實例化抽象類

'filter_A :: filter_A':不能訪問類中聲明 'filter_A'

保護成員謝謝。

回答

4

「管道」:不能實例化抽象類

您從抽象基類繼承BaseClassPipeline。這意味着如果你不覆蓋該類的純虛函數,那麼你的派生類也將是抽象的。

class Pipeline:public BaseClassPipeline, public PipelineAttr 
{ 
public: 
    Pipeline::Pipeline(FILE *cfgFile, SRV *p_Srv) : PipelineAttr(cfgFile, p_Srv){} 
    int executeFilter (SRV *p_Srv) {}  <<<< Now, you have provided the definition. 

'filter_A :: filter_A':不能訪問受保護的成員在課堂上 'filter_A'

正確的語法聲明定義filter_A是: -

class filter_A:public BaseClassPipeline 
{ 
public: 
    filter_A(); 
    int executeFilter (SRV *p_Srv) { return 1; } 
    ~filter_A(); 
}; 
+0

嘿嘿,謝謝你你回答。我很抱歉我缺乏知識。你的意思是「如果你不覆蓋該類的純虛函數,那麼你的派生類也將是抽象的。」 ? 我應該爲主執行「管道管道(cfgFile,srv)」; ? – user1673206 2015-01-04 11:27:21

+0

我已經更新了答案......如果您瀏覽網站,您將會更多地瞭解抽象類。 – ravi 2015-01-04 11:54:13

相關問題