5

我最近从 Java 过渡到了 C++,但在弄清楚类继承如何准确工作时遇到了一些困难。目前,我有 classWeapon和 class MinigunMinigun继承类Weapon,这意味着它应该具有Weapon定义的方法和变量。我的问题是我在内部有一个私有常量 static int和一个返回整数的公共方法,Weapon称为. 只需返回类中定义的速率变量。当extends并且我在里面设置 rate时,该方法仍然从类中返回常量,即使它是在rategetRate()getRate()MinigunWeaponMinigungetRate()WeaponMinigun班级。我以为它会像 Java 一样,继承的方法会在Minigun. 目前我必须做以下事情;

武器.h

#ifndef __WEAPON__
#define __WEAPON__

class Weapon
{
    public:
        virtual int getRate()
        {
            return rate;
        }
    private:
        const static int rate = 0;
};

#endif

迷你枪.h

#include "Weapon.h"

#ifndef __WEAPON_MINIGUN__
#define __WEAPON_MINIGUN__

class Minigun: public Weapon
{
public:
    int getRate(); // I have to define this here, and create it inside Minigun.cpp
private:
    const static int rate = 30;
};

#endif

迷你枪.cpp

#include "Minigun.h"

int Minigun::getRate() // Is there a way so I do not need to type this out for every class that extends Weapon?
{
    return rate;
}
4

2 回答 2

2

Weapon实例将返回通过率,Weapon::rate实例getRate()Minigun返回Minigun::rate.

因为该方法getRate()是虚拟的,所以对实例的Weapon指针或引用将返回.MinigunMinigun::rate

如果派生类中只有速率变量发生变化,则模板类将需要比动态多态版本更少的编码。模板版本如下所示:

    template<int Rate = 0>
    class Weapon
    {
        public:
            int getRate() // no need for virtual anymore
            {
                return rate;
            }
        private:
            const static int rate = Rate;
    };

    class Minigun: public Weapon<30> {};
于 2013-09-02T23:51:23.663 回答
1

不要让它是静态的。例如:

#include <iostream>

class Weapon {
    public:
       Weapon();
       virtual int Rate();
       virtual void Rate(int r);
    protected:
       int rate;
};

Weapon::Weapon() {
    rate = 10;
}

class Minigun : public Weapon {
    public: 
         Minigun();
};

Minigun::Minigun() {
    rate = 30;
}

int Weapon::Rate() {
    return rate;
}
void Weapon::Rate(int r) {
    rate = r;
}

int main() {
    Minigun ThisGun;
    Weapon AnyGun;
    std::cout << ThisGun.Rate() << std::endl;
    std::cout << AnyGun.Rate() << std::endl;
    AnyGun.Rate(15);
    std::cout << AnyGun.Rate() << std::endl;

    return 0;
}

我们在基类中声明了一个受保护的 int。这意味着任何继承基类的派生类也将具有该变量。static如果您只想为该对象的所有实例共享该变量的一个实例,则 只需声明一个变量。

基构造函数将在派生构造函数之前被调用。您可以在派生构造函数中为该特定类型的对象重置默认值。公共函数将调用最衍生的虚函数。在这种情况下,我们希望我们的速率函数具有相同的行为,因此Minigun我们简单地不实现任何函数,而是调用函数。输出是:MinigunWeapon

30
10
15
于 2013-09-02T23:58:32.690 回答