请教一个关于抽象类的问题

tianshilei1992 2014-03-05 11:18:36
我想做一个简易的RPG小游戏,有要求需要用到抽象类,需要有攻击、防御、致命一击这样的功能,所以我将抽象类定义成如下:

class Role
{
public:
virtual int attack() = 0;
virtual int defend() = 0;
virtual int hit() = 0;
}

接下来要继承该类,我想写成下面这样的:

class Player : public Role
{
public:
Player();
Player(string name, char hp, char att, char def, char lv) : strName(name), chHP(hp), chAttack(att), chDefence(def), chLevel(lv) {}
int attack(Player);
int defend(Player);
int hit(Player);
int getHP();
int setModifyHP(int);
private:
string strName;
char chHP;
char chAttack;
char chDefence;
char chLevel;
};

但是这样编译器会报错,提示Player是抽象类。难道必须要在函数写一个int attack()这样的,然后再写个重载的函数int attack(Player)这样子吗?能不能在参数列表里面加一个可以强制转换成任何类的那样?就类似Java中的Object类?
C++两年前学的,当时通看了C++ Primer,现在都忘了……所以如果大家觉得这个问题小儿科,大家不要吐槽……
...全文
126 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
derekrose 2014-03-05
  • 打赏
  • 举报
回复
引用 2 楼 tianshilei1992 的回复:
[quote=引用 1 楼 derekrose 的回复:] 不吐槽啊 问题很好! 个人认为你在base class里面应该这样写

class Role
{
public:
    virtual int attack(Role&) = 0;
    virtual int defend(Role&) = 0;
    virtual int hit(Role&) = 0;
}
那在Player里面就是int attack(Player&)喽?试过这样是可以的哦!~~哈哈[/quote]
tianshilei1992 2014-03-05
  • 打赏
  • 举报
回复
引用 1 楼 derekrose 的回复:
不吐槽啊 问题很好! 个人认为你在base class里面应该这样写

class Role
{
public:
    virtual int attack(Role&) = 0;
    virtual int defend(Role&) = 0;
    virtual int hit(Role&) = 0;
}
那在Player里面就是int attack(Player&)喽?试过这样是可以的哦!~~哈哈
derekrose 2014-03-05
  • 打赏
  • 举报
回复
不吐槽啊 问题很好! 个人认为你在base class里面应该这样写

class Role
{
public:
    virtual int attack(Role&) = 0;
    virtual int defend(Role&) = 0;
    virtual int hit(Role&) = 0;
}
derekrose 2014-03-05
  • 打赏
  • 举报
回复
tianshilei1992 2014-03-05
  • 打赏
  • 举报
回复
引用 10 楼 derekrose 的回复:
你没有自己写copy构造函数吗?
Copy构造函数没有写……但是找到问题了,很低级的问题……就是……我只在.h声明了那些方法,但是没有在cpp文件中实现它……不好意思……
derekrose 2014-03-05
  • 打赏
  • 举报
回复
你没有自己写copy构造函数吗?
tianshilei1992 2014-03-05
  • 打赏
  • 举报
回复
引用 8 楼 derekrose 的回复:
xcode我没碰过 但是感觉你的设计上是不是有什么问题?
连g++也是同样的错误,等我去虚拟机下跑试试。
derekrose 2014-03-05
  • 打赏
  • 举报
回复
xcode我没碰过 但是感觉你的设计上是不是有什么问题?
tianshilei1992 2014-03-05
  • 打赏
  • 举报
回复
引用 6 楼 derekrose 的回复:
int attack(Player&);应该是int attack(Role&);
那在引用的时候,如果加一个强制类型转换,比如
Player &p1 = (Player &)p2
编译的时候就会提示错误,Xcode返回错误:

Undefined symbols for architecture x86_64:
  "Player::getDefence()", referenced from:
      Player::attack(Role&) in main.o
      Player::attack(Role&) in Game.o
  "Player::getHP()", referenced from:
      Player::attack(Role&) in main.o
      _main in main.o
      Player::attack(Role&) in Game.o
  "Player::setHP(int)", referenced from:
      Player::attack(Role&) in main.o
      Player::hit(Role&) in main.o
      Player::attack(Role&) in Game.o
      Player::hit(Role&) in Game.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
g++返回错误和上面那个一样。
derekrose 2014-03-05
  • 打赏
  • 举报
回复
int attack(Player&);应该是int attack(Role&);
tianshilei1992 2014-03-05
  • 打赏
  • 举报
回复
引用 3 楼 derekrose 的回复:
[quote=引用 2 楼 tianshilei1992 的回复:] [quote=引用 1 楼 derekrose 的回复:] 不吐槽啊 问题很好! 个人认为你在base class里面应该这样写

class Role
{
public:
    virtual int attack(Role&) = 0;
    virtual int defend(Role&) = 0;
    virtual int hit(Role&) = 0;
}
那在Player里面就是int attack(Player&)喽?试过这样是可以的哦!~~哈哈[/quote][/quote] 版主,您看看我的声明,在实例化的时候提示Player类是一个抽象类,这是怎么回事?

class Role
{
public:
    virtual int attack(Role&) = 0;
    virtual int defend() = 0;
    virtual int hit(Role&) = 0;
};

class Player : public Role
{
public:
    Player();
    Player(string name, char hp, char att, char def, char lv) : strName(name), chHP(hp), chAttack(att), chDefence(def), chLevel(lv) {}
    int attack(Player&);
    int defend();
    int hit(Player&);
    int getHP();
    int getAttack();
    int getDefence();
    int setHP(int);
private:
    string strName;
    char chHP;
    char chAttack;
    char chDefence;
    char chLevel;
    bool isDefend;
};
不是说如果继承抽象类的类没有重写抽象类的抽象方法,那这个类也是抽象类,我这个是不是这种问题?
AndyStevens 2014-03-05
  • 打赏
  • 举报
回复
抽象类中的抽象接口即纯虚函数,必须在具体类中全部实现才能实例化的。

64,652

社区成员

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

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