我可能有錯誤的觀念上正是多態性與繼承,但基本上我想要做的是有CLASSB從CLASSA派生,並創建一個CLASSB它覆蓋CLASSA的純虛成員函數,如下所示:多態性/繼承問題與虛擬類的成員函數
CLASSA:
/////////////////
// CodeBlock.h //
/////////////////
typedef enum {
CCBT_UNDEFINED,
CCBT_FUNCTION,
//...
} CODE_BLOCK_TYPE;
class CCodeBlock {
public:
CCodeBlock::CCodeBlock();
CCodeBlock::CCodeBlock(CString& source, DWORD startPos);
CCodeBlock::~CCodeBlock();
virtual CODE_BLOCK_TYPE CCodeBlock::GetType() = 0
CString m_code;
DWORD m_startPos;
DWORD m_length;
int m_numLines;
}
///////////////////
// CodeBlock.cpp //
///////////////////
//...
CCodeBlock::CCodeBlock(CString& source, DWORD startPos) : m_code(source), m_startPos(startPos) {
m_length = m_code.GetLength();
}
CODE_BLOCK_TYPE CCodeBlock::GetType() {
return CCBT_UNDEFINED;
}
CLASSB:
/////////////////////
// FunctionBlock.h //
/////////////////////
#include "CodeBlock.h"
class CFunctionBlock : public CCodeBlock {
public:
CFunctionBlock::CFunctionBlock();
CFunctionBlock::CFunctionBlock(CString& source, DWORD startPos);
CFunctionBlock::~CFunctionBlock();
CODE_BLOCK_TYPE CFunctionBlock::GetType();
}
///////////////////////
// FunctionBlock.cpp //
///////////////////////
//...
CFunctionBlock::CFunctionBlock(CString& source, DWORD startPos)
{
m_code = source;
m_startPos = startPos;
}
CFunctionBlock::~CFunctionBlock()
{
CCodeBlock::~CCodeBlock();
}
CODE_BLOCK_TYPE CFunctionBlock::GetType()
{
//////////////////////////////
// >> NEVER GETS CALLED! << //
//////////////////////////////
return CCBT_FUNCTION;
}
主:
CCodeBlock *block = new CFunctionBlock(L"function hello(){ print('hello') }", iPos)
CODE_BLOCK_TYPE type = block->GetType(); // ALWAYS RETURNS CCBT_UNDEFINED!
正如你所看到的,的GetType()總是返回 CCBT_UNDEFINED。請記住,CCodeBlock是CFunctionBlock的一個'通用'版本(以及其他一些志同道合的類,其中一些包含CCodeBlock'm_parent'成員變量),並且應該繼承任何CCodeBlock成員變量&成員函數,以及覆蓋CCodeBlock中包含的特定函數列表。
這是如何實現的?我是否需要訴諸使用模板(如果甚至可能的話)?
順便說一句,當你在類「CCodeBlock」中聲明成員函數時,你不需要'CCodeBlock ::' – billz 2013-02-26 03:23:12
而且,類型不匹配。 'CCodeBlock CFunctionBlock :: GetType()'vs'CODE_BLOCK_TYPE CCodeBlock :: GetType()'。這段代碼是否可以編譯? – Matthew 2013-02-26 03:25:43
@billz是一個複製/粘貼錯字,CFunctionBlock :: GetType()例外 - 這似乎一直是問題。刪除'CFunctionBlock ::'後,block-> GetType()現在返回CCBT_FUNCTION。非常感謝!如果您將此作爲答案發布,我會爲您讚揚。 – RectangleEquals 2013-02-26 03:30:12