[英]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.