在cpp中使用带有虚拟继承的关键字

问题描述 投票:0回答:1

我想解决我的 Paladin 类的继承问题。这是我的类之间的继承的简历:

class Peasant
{
    virtual int attack();
}

class Knight : virtual public Peasant
{
    int attack() override;
}

class Enchanter : public Peasant
{
    int attack() override;
}

class Priest : virtual public Enchanter

class Paladin : public Knight, public Priest
{
    using Knight::attack();
}

这样我得到了以下错误:

Paladin.hpp:16:7: error: no unique final redefinition « virtual int Peasant::attack() » in « Paladin »
   16 | class Paladin : public Knight, public Priest
      |       ^~~~~~~

官方错误消息中的文字可能有所不同,因为我将此错误从另一种语言翻译成英语。

我这样解决了我的问题:

class Peasant
{
    int attack();
}

class Knight : virtual public Peasant
{
    int attack();
}

class Enchanter : public Peasant
{
    int attack();
}

class Priest : virtual public Enchanter

class Paladin : public Knight, public Priest
{
    using Knight::attack();
}

但我不太喜欢这个解决方案。当我在派生类中重写基类的方法时,我更喜欢使用

virtual
override
。 我知道我能做到:

class Peasant
{
    virtual int attack();
}

class Knight : virtual public Peasant
{
    virtual int attack() override;
}

class Enchanter : public Peasant
{
    virtual int attack() override;
}

class Priest : virtual public Enchanter

class Paladin : public Knight, public Priest
{
    int attack() override {return Knight::attack();};
}

但是在我只是重复使用一种方法的情况下,我认为使用

using
更优雅。

所以我想知道是否有办法以相同的语法同时使用

virtual
/
override
using

提前谢谢您:D

c++ inheritance overriding virtual using
1个回答
0
投票

您的第二个选择是正确的选择。

using
不定义函数,而是将名称带入作用域。

您还有另一个错误,

attack
在每个类中都是私有的,所以您不能
return Knight::attack()

不是语法错误,但您至少在

virtual
中缺少继承
Enchanter
,并且可能在
Paladin
中。

struct Peasant
{
    virtual int attack();
};

struct Knight : virtual Peasant
{
    int attack() override;
};

struct Enchanter : virtual Peasant
{
    int attack() override;
};

struct Priest : virtual Enchanter
{};

struct Paladin : virtual Knight, virtual Priest
{
    int attack() override { return Knight::attack(); };
};

但是,尝试将游戏规则嵌入到继承层次结构中的子类中就像在方孔中安装圆钉一样。

© www.soinside.com 2019 - 2024. All rights reserved.