【发布时间】:2013-02-11 09:54:33
【问题描述】:
我可能对究竟什么是多态性与继承有错误的想法,但基本上我想要做的是让 classB 派生自 classA,并创建一个 classB 覆盖 classA 的纯虚成员函数强>,像这样:
A 类:
/////////////////
// 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;
}
B 类:
/////////////////////
// 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:: -
另外,类型不匹配。
CCodeBlock CFunctionBlock::GetType()与CODE_BLOCK_TYPE CCodeBlock::GetType()。这段代码还能编译吗? -
@billz 这是一个复制/粘贴错字,CFunctionBlock::GetType() 除外——这似乎一直是问题所在。删除 'CFunctionBlock::' 后,block->GetType() 现在返回 CCBT_FUNCTION。所以谢谢你!如果您将此作为答案发布,我会为您服务。
-
@Matthew 再次复制/粘贴错字。最初的名称是 JJCodeBlock、JJFunction 和 _JJ_BLOCK_TYPE,但为了简单起见,我决定编辑它们。这样做时犯了一些错误。我将编辑我的帖子以更正此问题。
-
@RectangleEquals:代码仍然格式不正确,还有一些其他问题。下次请记住,只有当问题确实代表您的真实代码时,人们才能帮助解决您的问题。也就是说,在复制导致问题的确切代码时要格外小心。
标签: c++ class function inheritance polymorphism