首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++如何确保在使用虚拟继承时,它调用的是继承函数而不是基函数

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

Stack Overflow用户
提问于 2012-03-23 20:14:21
回答 3查看 195关注 0票数 1

我是C++的新手,非常感谢大家的帮助。我有一个处理类和继承的任务。我的理解是,我可以在基类中编写一个虚函数,它会被继承类中的同名函数覆盖。当我调用任何继承的类时,这可以很好地工作,但当我将它们插入到为接收基类而编写的函数中时,即使它接收的对象来自继承的类,它也会从继承的类中调用初始化器,但其他函数仅从基类中调用。以下是我的代码的简短版本:

基类:

代码语言:javascript
复制
#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

继承类:

代码语言:javascript
复制
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;
}

我是如何使用它的:

代码语言:javascript
复制
class Tournament
{
public:
    Tournament();
    Player bout(Player, Player);
    Player Tournament::bout (Player p1, Player p2)
    {
        p1.setMove();
        p2.setMove();
        return p1;
    }
};

这样做的结果是将移动设置为零,而不是“摇滚乐”。

提前感谢你在正确方向上的任何指点。这把我难倒了。

-Victoria

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-23 20:18:42

不能将动态绑定与复制传递的参数一起使用。必须将引用(Player&)或常量引用(Player const&)或指针(Player*)或指针传递给常量(Player const*)。

示例:如果您实例化Avalanche并将其传递给接收Player的对象,则会发生以下情况:

C++会看到获得Player的签名,因此它将使用签名为Player::Player(Player const&)的默认副本构造函数创建对象的本地副本。因为它是从Player公开继承的,所以可以用Avalanche参数调用它。尝试隐藏Player的复制构造函数,以了解发生了什么。

请随时指出您不理解的事情。

票数 3
EN

Stack Overflow用户

发布于 2012-03-23 20:19:01

您正在将Player对象传递给bout,因此您没有利用多态性。

您应该传递指针或通过引用:

代码语言:javascript
复制
Player bout(Player*, Player*);
//or
Player bout(Player&, Player&);

请注意,在您的版本中,如果将Avalanche对象传递给该方法,将会遇到对象切片(请查看)。

票数 0
EN

Stack Overflow用户

发布于 2012-03-23 20:19:38

调用Tournament::bout时,将从传入的Avalanche对象构造两个新的Player对象。

Player构造函数不知道它正在从中复制/移动的对象的Avalanche部分,因此只复制Player部分。

p1p2Player%s,因此它们的行为类似于Player%s,而不是Avalanche%s。

如果您不想构造新的Player对象,则通过引用传递参数:

代码语言:javascript
复制
Player& Tournament::bout (Player& p1, Player& p2)
{
    p1.setMove();
    p2.setMove();
    return p1;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9839008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档