Storage of types in Structs and Classes

I’m wondering as to the best way to store different types of weapons for my game. Say for instance that I have a weapon with three different variables to it: fireRate, damage, and accuracy (simplified for the sake of explanation). What would be the best way to create many different versions of the base weapon where say the SMG has a firerate of 0.1, damage of 5, and accuracy of 5, where the Rifle has a firerate of 1, damage of 20, and accuracy of 1? One attempt I have made was to create a base struct or class called BulletType containing the basic variables fireRate, damage, and accuracy, and then multiple other classes/structs that extend BulletType and assign their own values to the variables inherited from BulletType. In practice, I want to be able to create a new instance of, say, the SMG class, and add it to the List of bullet types that can be toggled between on the player.

In essence, my question boils down to two things:

  1. Are structs or classes ideal for
    this basic storage of weapon types
  2. Is this approach the way to go about storing this data? The data is very simple and there is not much more to be stored besides a bunch of floats and bools, I just need a simple way to go about creating and storing weapon types that can be called easily at runtime.

First, structs won’t do as you cannot inherit from them.

So go for a Weapon class containing everything that is common to all weapon, that is damage, power, ammo count and so on.

Then you would have some of the methods to be protected or public and containing again what is common to all weapons. What is only relevant to the weapon itself should be private. For instance, if you pass a sprite to the weapon class, then you apply it to the renderer via a private method since sub classes should not be concerned about it.

Finally, what is common to all weapons but different in implementation should be a abstract or virtual method that you override in the sub class.