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

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;
}
...全文
102 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
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() {};
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:

};
njzsj 2004-03-18
  • 打赏
  • 举报
回复
我在CB里面编译,只需要给Query增加一个虚拟函数就可以了!
快乐鹦鹉 2004-03-18
  • 打赏
  • 举报
回复
NameQuery* p = dynamic_cast<NameQuery *>(pq);
可以强制转换
NameQuery* p = (NameQuery*)(pq);
其他程序没有问题。
AHigher 2004-03-18
  • 打赏
  • 举报
回复
Query 都是NameQuery的基类,怎么能把基类型指针转换成子类呢?
好象没见过这样的。
SpitFire 2004-03-18
  • 打赏
  • 举报
回复
你编译有问题?还是运行有问题?

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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