为什么一样的写法一个对一个错

m0_37219011 2016-12-31 03:02:31
#ifndef MOVAB:E_H
#define MOVABLE_H
class Movable{
public:
virtual void move() = 0;
private:

};
#endif


#ifndef BUS_H
#define BUS_H
#include "Movable.h"
#include <iostream>
using namespace std;
class Bus : public Movable{
public:
virtual void move(){
cout << "Bus--move()" << endl;
}
void carry(){
cout << "carry()" << endl;
}
private:

};
#endif


#ifndef TANK_H
#define TANK_H
#include "Movable.h"
#include <iostream>
using namespace std;
class Tank : public Movable{
public:
virtual void move(){
cout << "Tank--move()" << endl;
}
void shot(){
cout << "shot()" << endl;
}
private:

};
#endif


#include <iostream>
using namespace std;
#include "Movable.h"
#include "Bus.h"
#include "Tank.h"
void doSomething(Movable *obj){
obj->move();
if (typeid(*obj) == typeid(Bus)){
Bus *bus = dynamic_cast<Bus *>(obj);
bus->carry();
}
if (typeid(*obj) == typeid(Tank)){
Tank *tank = dynamic_cast<Tank *>(obj);
tank->shot();
}
}
int main(){
Tank tank;
Bus bus;
doSomething(&tank);

return 0;
}请问 一下为什么我用.h头文件的方法编写时错误的,但是用下面这种源文件方法是对的,找了半天也没找到原因。。求大神帮帮忙。。谢谢~祝大家元旦快乐
#include <iostream>
using namespace std;

/**
* 定义移动类:Movable
* 纯虚函数:move
*/
class Movable
{
public:
virtual void move() = 0;
};

/**
* 定义公交车类:Bus
* 公有继承移动类
* 特有方法carry
*/
class Bus : public Movable
{
public:
virtual void move()
{
cout << "Bus -- move" << endl;
}

void carry()
{
cout << "Bus -- carry" << endl;
}
};

/**
* 定义坦克类:Tank
* 公有继承移动类
* 特有方法fire
*/
class Tank :public Movable
{
public:
virtual void move()
{
cout << "Tank -- move" << endl;
}

void shot()
{
cout << "Tank -- shot" << endl;
}
};

/**
* 定义函数doSomething含参数
* 使用dynamic_cast转换类型
*/
void doSomething(Movable *obj)
{
obj->move();

if (typeid(*obj) == typeid(Bus))
{
Bus *bus = dynamic_cast<Bus *>(obj);
bus->carry();
}

if (typeid(*obj) == typeid(Tank))
{
Tank *tank = dynamic_cast<Tank *>(obj);
tank->shot();
}
}

int main(void)
{
Bus b;
Tank t;
doSomething(&b);
doSomething(&t);
return 0;
}
...全文
194 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-01-03
  • 打赏
  • 举报
回复
关于自己是否适合编程的很简单的测试: 在报纸或杂志上随便找一段约1000字的文章,在Word中输入一遍。输完后再参考下面答案: A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样,且自我感觉很有成就感 A不适合编程(理由:打字准确度偏低、粗心大意) B初级程序员(理由:打字准确度很高、认真细致、自信、理解全角半角概念) C高级程序员(理由:在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证) D软件项目经理(理由:能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业!) 如果想从A变成B的话,到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”
yes-hyh 2017-01-03
  • 打赏
  • 举报
回复
写法肯定是没问题的,不过楼主的Movable.h的第一行写错了 #ifndef MOVAB:E_H 应该是 #ifndef MOVABLE_H 应该是笔误,不知是拷贝的时候弄错的,还是本来就写错了,如果是本来就写错了,那就是这个错误了。
ri_aje 2017-01-01
  • 打赏
  • 举报
回复
试了一下,都没问题啊。 需要 #include <typeinfo>

64,650

社区成员

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

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