Xerces C++抽象类问题

ksdjfalsfj 2012-02-08 03:45:46
你好!
我是C++新手,请教一个问题。

在Xerces C代码中,有一些抽象类问题不是很明白。
比如类DOMNode,其中有纯虚函数。该类没有父类,子类不知道有没有。

然后在项目中,直接使用
DOMNode* xmlNode = NULL;

xmlNode->getNodeValue();其中getNodeValue是DOMNode的纯虚函数。

这样运行没有错误。

这样是不是算抽象类实例化呢?
...全文
137 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ksdjfalsfj 2012-02-08
  • 打赏
  • 举报
回复
谢谢各位的解答。
有点明白了。

自己死读书了……
纯洁的老黄瓜 2012-02-08
  • 打赏
  • 举报
回复
xmlNode = nodeOption->getAttributes()->getNamedItem(Char2XmlCh("name")

nodeOption是个节点,此时它是一个变量,也就是一个实例了,->getAttributes()得到属性节点列表,得到的属性节点列表也是一个实例变量是吧?然后再调用属性列表的getNamedItem查询得到名为"name"的节点.然后将此节点赋值给xmlNode
ksdjfalsfj 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 maoshuoqiong 的回复:]

你应该是不明白多态吧?

DOMNode* xmlNode = NULL;

if(NULL == (xmlNode = nodeOption->getAttributes()->getNamedItem(Char2XmlCh("name").get())))
{
……
[/Quote]


在xerces-c中getNamedItem的原型:
virtual DOMNode *getNamedItem(const XMLCh *name) const = 0;
pengzhixi 2012-02-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ksdjfalsfj 的回复:]
不是纯虚函数需要子类实现
然后子类实例化。
这个实例化的子类然后调用这个函数吗?

可以直接调用自己的纯虚函数吗?
[/Quote]
这个抽象类的指针肯定会指向一个子类对象的。如果没有肯定出错。
纯洁的老黄瓜 2012-02-08
  • 打赏
  • 举报
回复
你应该是不明白多态吧?

DOMNode* xmlNode = NULL;

if(NULL == (xmlNode = nodeOption->getAttributes()->getNamedItem(Char2XmlCh("name").get())))
{
continue;
}

此处getNamedItem()方法会返回一个变量,而这个变量类型是继承于DOMNode类的,xmlNode此时指向的是这个变量,调用的也是这个变量的方法。如果还不大明白,你可以去看看多态
ksdjfalsfj 2012-02-08
  • 打赏
  • 举报
回复
不是纯虚函数需要子类实现
然后子类实例化。
这个实例化的子类然后调用这个函数吗?

可以直接调用自己的纯虚函数吗?
pengzhixi 2012-02-08
  • 打赏
  • 举报
回复
这个和你说的完全不同了。只要使用前赋予了正确的值就没问题了。不可能直接赋值NULL后就调用纯虚函数的。
ksdjfalsfj 2012-02-08
  • 打赏
  • 举报
回复
void CConfigParser::reload()
{
XercesDOMParser xmlParser;
DOMDocument* xmlDoc = NULL;
DOMNode* xmlRoot = NULL;
bool IsFirst = true;

CScopeLock sl(m_FileMutex);

xmlParser.parse(m_sConfigFile.c_str());
if(NULL == (xmlDoc = xmlParser.getDocument()))
{
_throwfmt(__FILE__, __LINE__, errno, "加载配置文件失败:%s", m_sConfigFile.c_str());
}

if(NULL == (xmlRoot = xmlDoc->getDocumentElement()))
{
_throwfmt(__FILE__, __LINE__, errno, "取配置文件根结点失败:%s", m_sConfigFile.c_str());
}

m_ConfigMap.clear();

if (xmlRoot->getNodeType() == DOMNode::ELEMENT_NODE)
{
for (DOMNode * nodeOption = xmlRoot->getFirstChild();
nodeOption != 0; nodeOption = nodeOption->getNextSibling())
{
if (nodeOption->getNodeType() == DOMNode::ELEMENT_NODE
&& 0 == strcasecmp("option", XmlCh2Char(nodeOption->getNodeName()).get())
&& nodeOption->hasAttributes())
{
DOMNode* xmlNode = NULL;

if(NULL == (xmlNode = nodeOption->getAttributes()->getNamedItem(Char2XmlCh("name").get())))
{
continue;
}

string sName = trim(XmlCh2Char(xmlNode->getNodeValue()).get());

if (sName.empty())
{
continue;
}

string sValue = trim(XmlCh2Char(nodeOption->getTextContent()).get());

if (sValue.empty())
{
continue;
}

m_ConfigMap[sName] = sValue;

if(IsFirst)
{
IsFirst = false;
}

}
}
}
}



这是这一段代码。
运行时候不会是NULL的。

主要是这种用法我不明白,请熟悉的朋友帮忙解析一下
cobra_chen 2012-02-08
  • 打赏
  • 举报
回复
纯虚函数是这样用的么?
不知道这要实现一个什么样的功能。
我记得虚函数一般用于继承派生用的。
虚函数一般是基类不实现,而在派生类中实现这个函数的功能。
估计要看具体什么功能,还要到派生类中去看
纯洁的老黄瓜 2012-02-08
  • 打赏
  • 举报
回复
DOMNode* xmlNode = NULL;

xmlNode->getNodeValue();

这里xmlNode是一个NULL值,调用一个NULL值的方法一般是会有错误的。

编译会通过,但是运行时会出错。你检查一下程序是否运行了此句。
ksdjfalsfj 2012-02-08
  • 打赏
  • 举报
回复
程序是直接用的 xerces-c的linux库,然后在自己的程序中引用头文件,makefile中包含库。

自己的代码中就是这样用的,但是运行正常的。

xerces-c中有没有子类继承我不清楚了。


所以,我不明白这个使用方法。
IVERS0N 2012-02-08
  • 打赏
  • 举报
回复
应该有子类继承 实体化对象吧
纯洁的老黄瓜 2012-02-08
  • 打赏
  • 举报
回复
这样运行不会出错?
运行的时候应该会报错吧

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧