我是 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;
}
};
这最终所做的是将移动设置为空,而不是“摇滚”。
提前感谢您提供正确方向的任何指示。这个让我难住了。
-维多利亚
最佳答案
您不能对复制传递的参数使用动态绑定(bind)。您必须传递引用 (Player&
) 或 const 引用 (Player const&
) 或指针 (Player*
) 或指向 const (播放器常量*
).
示例:如果您实例化一个 Avalanche
并将其传递给接收 Player
的对象,则会发生这种情况:
C++ 看到获取 Player
的签名,因此它将使用带有签名的默认复制构造函数创建对象的本地拷贝:Player::播放器(播放器常量&)
。此可以使用您的Avalanche
参数调用,因为它是公开从Player
继承的。尝试隐藏 Player
的复制构造函数,以了解发生了什么。
请随时指出您不明白的地方。
关于C++如何确保在使用虚拟继承时调用继承函数而不是基函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9839008/