我是C++的新手,非常感谢大家的帮助。我有一个处理类和继承的任务。我的理解是,我可以在基类中编写一个虚函数,它会被继承类中的同名函数覆盖。当我调用任何继承的类时,这可以很好地工作,但当我将它们插入到为接收基类而编写的函数中时,即使它接收的对象来自继承的类,它也会从继承的类中调用初始化器,但其他函数仅从基类中调用。以下是我的代码的简短版本:
基类:
#ifndef PLAYER_CPP
#define PLAYER_CPP
class Player
{
protected:
string playerThrow;
public:
//function that sets player throw
void virtual setMove();
string performMove() {return(playerThrow);}
};
#endif继承类:
class Avalanche: virtual public Player
{
public:
Avalanche();
//set specific move for class
void setMove()
{
//always plays rock
playerThrow = "rock";
}
};
//initializer, inherit from player, set new name
Avalanche::Avalanche() : Player()
{
//initialize name string
string newName;
//set name
newName = "Avalanche Player";
//sets name in player class
name = newName;
}我是如何使用它的:
class Tournament
{
public:
Tournament();
Player bout(Player, Player);
Player Tournament::bout (Player p1, Player p2)
{
p1.setMove();
p2.setMove();
return p1;
}
};这样做的结果是将移动设置为零,而不是“摇滚乐”。
提前感谢你在正确方向上的任何指点。这把我难倒了。
-Victoria
发布于 2012-03-23 20:18:42
不能将动态绑定与复制传递的参数一起使用。必须将引用(Player&)或常量引用(Player const&)或指针(Player*)或指针传递给常量(Player const*)。
示例:如果您实例化Avalanche并将其传递给接收Player的对象,则会发生以下情况:
C++会看到获得Player的签名,因此它将使用签名为Player::Player(Player const&)的默认副本构造函数创建对象的本地副本。因为它是从Player公开继承的,所以可以用Avalanche参数调用它。尝试隐藏Player的复制构造函数,以了解发生了什么。
请随时指出您不理解的事情。
发布于 2012-03-23 20:19:01
您正在将Player对象传递给bout,因此您没有利用多态性。
您应该传递指针或通过引用:
Player bout(Player*, Player*);
//or
Player bout(Player&, Player&);请注意,在您的版本中,如果将Avalanche对象传递给该方法,将会遇到对象切片(请查看)。
发布于 2012-03-23 20:19:38
调用Tournament::bout时,将从传入的Avalanche对象构造两个新的Player对象。
Player构造函数不知道它正在从中复制/移动的对象的Avalanche部分,因此只复制Player部分。
p1和p2是Player%s,因此它们的行为类似于Player%s,而不是Avalanche%s。
如果您不想构造新的Player对象,则通过引用传递参数:
Player& Tournament::bout (Player& p1, Player& p2)
{
p1.setMove();
p2.setMove();
return p1;
}https://stackoverflow.com/questions/9839008
复制相似问题