各位大侠,我的这段代码错在哪儿呢?请帮我看看!谢谢!

njzsj 2004-03-18 01:51:44
我是在VC6里面编译的。

#include <iostream>
#include <string>
using namespace std;

class Query
{
public:

private:

};

class NameQuery:public Query
{
private:

public:

void display()
{
cout << "In NameQuery!" << endl;
}

};


void print(Query *pq)
{
NameQuery* p = dynamic_cast<NameQuery *>(pq);

if(p)
{
p->display();
}
else
{
cout << "Error!" << endl;
}

}


int main()
{
Query *b = new NameQuery;

print(b);

return 0;
}
...全文
73 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
hdp4820 2004-03-23
好像运行又出问题!
回复
hongbo_liu 2004-03-22
mark
回复
popwindcom 2004-03-21
VC6里面也能用

#include <iostream>
#include <string>
using namespace std;

么?
回复
binxiao 2004-03-21
同意 popwindcom 的说法。
不知是不是我孤陋寡闻。。

”using namespace std “ 用 vc.net
回复
programhunter 2004-03-21
作为基类的类,其析构函数必须是虚函数,要不一定会出问题的
应该增加
public:
virtual ~Query();
回复
ymbymb 2004-03-19
没错,在Query里加一个虚函数就可以
public:
virtual void f() {};
回复
njzsj 2004-03-18
我在CB里面编译,只需要给Query增加一个虚拟函数就可以了!
回复
abitz 2004-03-18
当你使用dynamic_cast对指针进行转换时,被转换/目的类型应该是一个多态类型,
该类型的对象中要有vptr,dynamic_cast需要根据vptr指向的vtable来确定类型信息。
一个或多个自身的或继承而来的virtual function会导致vptr的产生。

在你的例子中,Query, NameQuery并不是多态类型。在这种类型上不能使用dynamic_cast。
事实上,作为基类,Query应该定义一个virtual的析构函数,这将导致对象中vptr的产生。
class Query
{
public:
virtual ~Query() {}
private:

};
回复
快乐鹦鹉 2004-03-18
NameQuery* p = dynamic_cast<NameQuery *>(pq);
可以强制转换
NameQuery* p = (NameQuery*)(pq);
其他程序没有问题。
回复
AHigher 2004-03-18
Query 都是NameQuery的基类,怎么能把基类型指针转换成子类呢?
好象没见过这样的。
回复
SpitFire 2004-03-18
你编译有问题?还是运行有问题?
回复
相关推荐
发帖
工具平台和程序库
创建于2007-09-28

2.4w+

社区成员

C/C++ 工具平台和程序库
申请成为版主
帖子事件
创建了帖子
2004-03-18 01:51
社区公告
暂无公告