C++如何确保在使用虚拟继承时调用继承的函数而不是基函数
C++ how to ensure when using virtual inheritance that it calls the inherited and not the base function
我是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;
}
};
这样做的结果是将移动设置为零,而不是"摇滚"。
提前感谢您为我们提供正确的指导。这个让我很为难。
-维多利亚
不能将动态绑定与复制传递的参数一起使用。您必须传递引用(Player&
)或常量引用(Player const&
)或指针(Player*
)或指向常量(Player const*
)的指针。
示例:如果实例化一个Avalanche
并将其传递给接收Player
的对象,则会发生以下情况:
C++看到了获得Player
的签名,因此它将使用带有签名的默认副本构造函数Player::Player(Player const&)
创建对象的本地副本。这个可以用Avalanche
参数调用,因为它是从Player
公开继承的。尝试隐藏Player
的复制构造函数,以了解发生了什么。
请随意指出你无法理解的事情。
您将Player
对象传递给bout
,因此您没有利用多态性。
您应该通过指针或引用传递:
Player bout(Player*, Player*);
//or
Player bout(Player&, Player&);
请注意,在您的版本中,如果将Avalanche
对象传递给该方法,您将遇到对象切片(查找)。
调用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;
}
- C++继承 - 为什么调用父方法?
- C++模板类 - 继承调用错误的函数
- 继承:调用基类的成员和方法
- C++意外调用继承类的函数
- 如何在 c++ 多重继承中调用父非虚函数?
- 如何在继承层次结构中调用具有默认参数的构造函数?
- 如何调用继承的重载运算符<<并在派生类的输出中添加更多文本?
- 从基类调用继承类的方法.C++
- 派生类调用使用非继承成员的继承函数
- 在 lambda 函数 g++-4.8 中调用继承的受保护子类型
- 虚拟继承:调用没有匹配函数
- 多重继承:调用所有覆盖的函数
- 使用模板化继承调用祖父构造函数
- C++ 继承:调用带参数的构造函数
- C++继承:调用重载基类函数
- C++继承:调用父类构造函数
- 类继承调用不同的构造函数
- 用多重继承调用c++中被覆盖的函数
- visual C++/MFC多重继承调用基类构造函数
- 如何避免使用虚继承调用过多参数化的构造函数