【问题标题】:c++ : code explanation for method prototype with const = 0c++: const = 0 的方法原型的代码解释
【发布时间】:2014-02-06 21:43:49
【问题描述】:

我有一个类声明,其中包含一段我不理解的代码:

class Weapon
{
  public:
    virtual void attack() const = 0;
};

const = 0 部分是什么意思?

【问题讨论】:

    标签: c++ virtual


    【解决方案1】:

    这是一个纯虚方法 (=0),它不应该更改类的数据 (const)。您应该在派生自Weapon 的类之一中提供实现!看到这个:Difference between a virtual function and a pure virtual function

    您应该从Weapon(可以被认为是接口)具体类派生,例如AxeShotgun等......您将在其中提供attack()方法。

    【讨论】:

    • 好的,谢谢,你是对的,因为我的 class Weapon 继承自 class AWeapon
    • 虽然,对于Shotgun,通常的攻击方式确实会改变对象,所以attack不应该是const
    • @ChristopherCreutzig 我看过好莱坞电影,霰弹枪有无限的炮弹供应......或者可能是因为“弹药”变量永远不会因为它的常量而减少!
    • 或者默认是 iddqdidkfa :)
    • +1。旁注:该类应该定义一个虚拟析构函数,否则它不能真正用作多态基类(因为无法通过Weapon* 删除派生类的对象)。
    【解决方案2】:

    const 放在成员函数之后表示其中的代码不会修改包含对象(mutable 成员的情况除外)。这很有用,因为如果您无意中修改了对象,编译器会报告错误。

    = 0const 无关。它与virtual 一起使用,表示该函数是纯虚拟。这意味着它必须被子类覆盖。包含纯虚函数的类有时被描述为抽象,因为它们不能被直接实例化。

    使用您的示例,您将无法创建 Weapon 类型的对象,因为未定义 attack() 函数。您必须创建一个子类,例如:

    class Sword : public Weapon
    {
    public:
        void attack() const
        {
            // do something...
        }
    };
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 2019-08-18
    相关资源
    最近更新 更多