я мог бы иметь неправильное представление о точно, что полиморфизм против наследования, но в основном то, что я пытаюсь сделать, это 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
Кроме того, типы не совпадают. 'CCodeBlock CFunctionBlock :: GetType()' vs 'CODE_BLOCK_TYPE CCodeBlock :: GetType()'. Скомпилирует ли этот код? – Matthew
@billz - это опечатка с копией/вставкой, за исключением CFunctionBlock :: GetType() - которая, похоже, все время была проблемой. После удаления «CFunctionBlock ::», block-> GetType() теперь возвращает CCBT_FUNCTION. Так спасибо за это! Если вы опубликуете это как ответ, я отдам ему за него. – RectangleEquals