从下面的示例中可以看到,我有两个类-一个叫做Player,另一个叫Computer。Computer类是Player的子级。
我已经使用'new'关键字实例化了两个动态分配内存,以便能够在不同的范围内使用它们-请注意,计算机播放器是在if语句块中实例化的。
奇怪的是,它可以编译,而第二个播放器是使用Computer构造函数构造的,但是当我调用player2-> takeTurn()方法时,它使用的是Player :: takeTurn()方法,而不是Computer :: takeTurn()...
我不明白为什么。您可能从我使用的语言可以看出我是C ++的初学者,并且更习惯Java,所以也许我只是不了解C ++中继承的工作原理?
我尝试过的东西:
我的第一个念头是因为我使用的是Player *指针而不是Computer *指针(我不明白为什么会出现问题,但以为我会测试),所以我尝试像这样重播Player2的指针:
player2 = (Computer*) player2;
并且它可以编译并运行,但对输出没有影响。
有谁知道这是为什么发生的以及我该如何解决?
#include <iostream>
#include <string>
using namespace std;
class Player {
private:
string name;
bool isTurn;
bool isCrosses;
public:
//constructor
Player(string n = "") : name(n), isTurn(true), isCrosses(true) {}
//getters
string getName() {return name;}
bool getIsTurn() {return isTurn;}
bool getIsCrosses() {return isCrosses;}
//setters
void setName(string n) {name = n;}
void setIsTurn(bool b) {isTurn = b;}
void setIsCrosses(bool b) {isCrosses =b;}
//game functions
int takeTurn() {
cout << "Player " << name << " player taketurn function." << endl;
return 0;
}
};
class Computer : public Player {
public:
Computer() : Player("Computer") {
setIsCrosses(false);
setIsTurn(false);
}
int takeTurn() {
cout << "This is the computers taketurn function." << endl;
return 0;
}
};
int main() {
//innit game variables
bool playing = true;
bool vsComp = true;
Player* player1;
Player* player2;
player1 = new Player("aPlayer");
if (vsComp) player2 = new Computer;
//Gameloop
while (playing) {
//draw board
//take player input
if (player1->getIsTurn()) {
int cross = player1->takeTurn();
int naught = 0;
player1->setIsTurn(false);
player2->setIsTurn(true);
} else {
player2->takeTurn();
player1->setIsTurn(true);
player2->setIsTurn(false);
}
//update changes
}
//Clean up
delete player1;
delete player2;
player1 = 0;
player2 = 0;
}
takeTurn
应该是虚函数。在基类中,将虚函数放在函数定义之前:
virtual int takeTurn()
类的析构函数Player
也应该被声明并且应该是virtual
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句