C++如何确保在使用虚拟继承时调用继承函数而不是基函数

标签 c++ inheritance polymorphism

我是 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/

相关文章:

java - 方法调用是如何发生的?

Java在派生类中实现接口(interface)方法的方式

c++ - 可以在命令行参数中传递的最大字符串长度?

c++ - 你如何返回一个 sf::RenderWindow?

c++ - 将一个共享库静态链接到我的共享库

c++ - 基类中运算符重载的问题

javascript - 尝试在 Javascript (ES5) 中实现 OPP 继承的简单方法

c++ - Clang-Format:如何在 switch 语句中获取单行 case 语句

c++ - 抽象类中的纯虚函数,返回类型为基/派生类型

java - Python 多态 VS JAVA 多态