//今天看到的一段代码很奇怪,一个抽象类没有任何派生类,其中的纯虚函数自然没有实际定义。但是下面却能直接使用,这让我百思不得其解。
//贴出代码请高手解惑
//抽象类DTDVerifier,DTD是(document type definition)文件类型定义的意思
class DTDVerifier
{
public:
virtual bool IsValidSubtag(char* tagName, char* subTagName) = 0;
virtual bool IsValidAttributeName(char* tagName, char* attrName) = 0;
virtual bool IsValidAttributeValue(char* tagName, char* attrName, char* attrValue) = 0;
virtual char* GetRequiredAttribute(char* tagName, int index) = 0;
virtual bool CanHaveValue(char* tagName) = 0;
};
//下面的类与类DTDVerifier没有继承关系
class XMLTag
{
public:
XMLTag();
XMLTag(char* tagName);
~XMLTag();
//这个函数中用到了类DTDVerifier
bool ParseTag(StringParser* parser,
DTDVerifier* verifier, char* errorBuffer = NULL, int errorBufferSize = 0)
private:
char* fTag;
char* fValue;
OSQueue fAttributes;//链表类
OSQueue fEmbeddedTags;
OSQueueElem fElem;//链表节点类
};
bool XMLTag::ParseTag(StringParser* parser, DTDVerifier* verifier, char* errorBuffer, int errorBufferSize)
{
。。。。。
//下面是第一次用到DTDVerifier的函数IsValidAttributeName,但很明显这之前都没有实际定义吗??怎么直接就拿来用了呢??
//总不会因为函数名就知道它是干什么的了吧,c++还没这么高级吧!
if (verifier && !verifier->IsValidAttributeName(fTag, attr->fAttrName))
{
if (errorBuffer != NULL)
qtss_sprintf(errorBuffer, "Attribute %s not allowed in tag %s on line %d", attr->fAttrName, fTag, parser->GetCurrentLineNumber());
return false; // bad attribute specification
}
}