Jac*_*don 5 c++ methods inheritance constants static-variables
我最近从 Java 过渡到 C++,在弄清楚类继承的确切工作原理方面遇到了一些困难。目前,我有班级Weapon和班级Minigun。Minigun继承该类Weapon,这意味着它应该具有定义的方法和变量Weapon。我的问题是,我有一个名为 的私有常量 static int Weapon,rate以及一个返回名为 的整数的公共方法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)
不要让它是静态的。例如:
#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)