xyjzsh

虚拟指针的问题——memset相关


class Node
{
  
public:
Node(
void){}
~Node(void){}
virtual bool IsLeafNode()=0;

}
;
class InternalNode:public Node
{
public:
InternalNode()
{}
virtual ~InternalNode(void){}
virtual bool IsLeafNode(){return false;}
}
;

class LeafNode:public Node
{
public:
LeafNode()
{}
virtual ~LeafNode(){}
virtual bool IsLeafNode(){return true;}
}
;


定义以上的继承结构:LeafNode和InternalNode继承自Node
有一个虚方法IsLeaf来判断是否为叶子节点。
下面有这样的测试代码:
test()
{
   Node *node = new InternalNode();
   memset(node,0,sizeof(InternalNode));
   node->IsLeafNode();
}
上述代码编译正常,而运行时出错!
出现上述问题的原因是:
对于有虚函数的类,每一个类有一个虚函数表,而每一个对象中会有一个指针指向这个虚函数表。
当   Node *node = new InternalNode();时编译器会把一个指针知道InternalNode的虚函数表
但是memset(node,0,sizeof(InternalNode));却把这个指针设成了。
所以在调用的时候出现了运行时错误!

posted on 2011-03-14 15:46 呆人 阅读(430) 评论(0)  编辑 收藏 引用 所属分类: 数据结构


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2010年12月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

导航

统计

常用链接

留言簿(1)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜