簡體   English   中英

調用虛函數時的c ++分段錯誤

[英]c++ segmentation fault when calling virtual function

我正在C ++中進行OOP練習。 我有一堂課叫做WARRIOR。 它衍生自ICEMAN,NINJA,DRAGON,WOLF,LION。 在WARRIOR類中。

#ifndef WARRIOR_H
#define WARRIOR_H
#include "camp.h"
#include "weapon.h"
#include <string>
#include <iostream>
#include <vector>
using namespace std;

extern int R;
extern int K;
class Weapon;
class Camp;
class Warrior
{
private:
  string warriorName;
  int warriorHealth;
  int warriorAttack;
  Camp* belongTo;

public:
  int pos;
  int warNo;
  void UseArrow(Warrior *w, Weapon *wp);
  void UseBomb(Warrior *w, Weapon *wp); 
  void UseSword(Warrior *w, Weapon *wp);
  void BrokeWeapon();
  void FightBack(Warrior *w, Weapon *wp);
  //void CopyWeapon(Weapon* wp);

  vector<Weapon*>weapList;
  Warrior(string s, int h, int att, Camp* c)
    :warriorName(s), warriorHealth(h),
    warriorAttack(att), belongTo(c),
    pos(0){}

  void SetHealth(int h){warriorHealth += h;}
  void SetAttack(int h){warriorAttack += h;}

  int WarriorHealth(){return warriorHealth;}
  int WarriorAttack(){return warriorAttack;}
    string GetName(){return warriorName;}
  void Equip(string s);

  bool Is_alive(){return warriorHealth > 0;}

  virtual int GetSpecial() = 0;
  virtual void March() = 0;

};

class Dragon : public Warrior
{
  double dragonMorale;
public:
  Dragon(int m, int h, int att, Camp* c, 
      string s = "dragon")
    :Warrior(s, h, att, c), dragonMorale(m){}
  ///
  void DragonRoar();
  void ChangeMorale(bool win);


  int GetSpecial(){return dragonMorale;}
  void March(){};
};

class Ninja : public Warrior
{
public:
    Ninja(int h, int att, Camp* c, 
      string s = "ninja")
    :Warrior(s, h, att, c){}

  virtual int GetSpecial(){}
  virtual void March(){}
};

class Iceman : public Warrior
{
public:
    Iceman(int h, int att, Camp* c, 
      string s = "iceman")
    :Warrior(s, h, att, c){}

  virtual int GetSpecial(){};
  virtual void March();
};

class Lion : public Warrior
{
int lionLoyalty;
public:
Lion(int loy, int h, int att, Camp* c,
      string s = "lion")
    :Warrior(s, h, att, c), lionLoyalty(loy){};
      //std::cout << WarriorHealth() <<"heal\n";}
void LoseLoyal();
void TransLife(Warrior *w);

  int GetSpecial(){return lionLoyalty;}
  virtual void March(){}
};

class Wolf : public Warrior
{
public:
Wolf(int h, int att, Camp* c,
      string s = "Lion")
    :Warrior(s, h, att, c){}
void Disarm(Warrior* w);
virtual int GetSpecial(){};

virtual void March(){}
};
#endif

void Iceman::March()
{
int temp = WarriorHealth();

if(temp < 10)
  SetHealth(-temp + 1);
else
  SetHealth(-9);

SetAttack(20);
}

我的主要功能:

#include "camp.h"
#include "warrior.h"
#include "weapon.h"
#include "city.h"

#include <iostream>
#include <iomanip>
#include <string>
#include <stdio.h>

using namespace std;

int R;
int K;
int N;

int main()
{

    Warrior* ptr = new Iceman(10, 10, NULL);
    ptr->March();//segmentation fault here

    return 0;
}

然后,我通過gdb運行了該程序。

Starting program: /home/linzhe/Working/cW/oop/8wk/wow/wow 
warning: no loadable sections found in added symbol-file 
system-supplied DSO 0x7ffff7ffa000

Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
(gdb) bt
#0  0x0000000000000000 in ?? ()
#1  0x00000000004063bf in main ()
(gdb) 

似乎是另一個虛函數

virtual int GetSpecial();

正常工作,但不能

virtual void March();

請幫助並提前致謝。 我使用g ++在Ubuntu 12.04下編譯程序。

//////

根據gdb的說法,似乎編譯器無法找到確切的虛函數嗎?

//////今天早上,我試圖將[warrior.cpp camp.cpp helmet.cpp city.cpp]復制到另一個文件夾,並編寫了一個新的main函數來調用Warrior :: March(),該方法起作用了。 但是,它在我的原始代碼上不起作用……

您對Iceman構造函數的調用無效:

Warrior* ptr = new Iceman(10, 10, 10, NULL); // Signature is (int, int, Camp*, [string])

因此,您實際上是將int(10)作為Camp對象的地址傳遞,並將string傳遞為NULL

如果-例如-您將對此構造函數的調用更改為

Warrior* ptr = new Iceman(10, 10, NULL);

它應該工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM