C++ 类方法继承

Jac*_*don 5 c++ methods inheritance constants static-variables

我最近从 Java 过渡到 C++,在弄清楚类继承的确切工作原理方面遇到了一些困难。目前,我有班级Weapon和班级MinigunMinigun继承该类Weapon,这意味着它应该具有定义的方法和变量Weapon。我的问题是,我有一个名为 的私有常量 static int Weaponrate以及一个返回名为 的整数的公共方法getRate()getRate()只是返回类中定义的速率变量。当Minigunextends Weapon,并且我在 inside 设置速率时Minigun,该getRate()方法仍然从类返回常量Weapon,即使它是在Minigun类上调用的。我认为它会像Java一样,继承的方法将使用内部修改的变量Minigun。目前我必须做以下事情;

武器.h

#ifndef __WEAPON__
#define __WEAPON__

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

#endif
Run Code Online (Sandbox Code Playgroud)

迷你枪.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
Run Code Online (Sandbox Code Playgroud)

迷你枪.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;
}
Run Code Online (Sandbox Code Playgroud)

Che*_*tpp 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;
}
Run Code Online (Sandbox Code Playgroud)

我们在基类中声明一个 protected int。这意味着继承基类的任何派生类也将具有该变量。static仅当您只想为该对象的所有实例共享该变量的一个实例时, 才声明该变量。

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

30
10
15
Run Code Online (Sandbox Code Playgroud)