5

私は最近 Java から C++ に移行しましたが、クラスの継承が正確にどのように機能するかを理解するのに苦労しています。現在、私はクラスWeaponとクラスを持っていMinigunます。Minigunclass を継承します。つまり、定義Weaponするメソッドと変数が必要です。Weapon私の問題は、内部にプライベート定数 static int があり、 とWeapon呼ばrateれる整数を返すパブリック メソッドがあることgetRate()です。getRate()クラスで定義されているレート変数を返すだけです。MinigunextendsWeaponでレートを内部に設定すると、Minigunメソッドが呼び出されているにもかかわらず、getRate()メソッドはクラスから定数を返します。WeaponMinigunクラス。Java のように動作し、継承されたメソッドは内部で変更された変数を使用すると思いましたMinigun。現在、次のことを行う必要があります。

武器.h

#ifndef __WEAPON__
#define __WEAPON__

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

#endif

Minigun.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、インスタンスへのポインターまたは参照Minigunは のレートを返しますMinigun::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その変数の 1 つのインスタンスのみをそのオブジェクトのすべてのインスタンスで共有する場合にのみ 、変数を宣言します。

基本コンストラクターは、派生コンストラクターの前に呼び出されます。その特定の型のオブジェクトの派生コンストラクターで既定値をリセットできます。パブリック関数は、最も派生した仮想関数を呼び出します。この場合、Minigunレート関数に対して同じように動作させたいので、単純に関数を実装しないMinigunので、Weapon代わりに関数が呼び出されます。出力は次のとおりです。

30
10
15
于 2013-09-02T23:58:32.690 に答える