I am looking for code correctness and design usage as I think I might be over doing it in the class department.There are two things I'm mostly concerned with.The possible redundancy of classes derived from IPerks. AsCommonPerks, UncommonPerks, etc, all look identical except forthe rows/columns in its internal perk list. I'm thinking I shouldjust have a concrete PerksList class instead.The use of an enum to keep track of constant values for the    different indices associated with the perkList. All perkList's    will follow the same order, so the indices will always mean the same    thing regardless of which IPerks derived class is being used.PerkSlotEnums.henum class PERK_SLOTS{    COMMON_SLOT_COLUMNS = 1,    COMMON_SCOPE_PERK_COUNT = 2,    SCOPE_SLOT_INDEX =0,    STATS_UPGRADE_A_SLOT_INDEX = 1,    UNIQUE_PERK_A_SLOT_INDEX = 2,    STATS_UPGRADE_B_SLOT_INDEX = 3,    UNIQUE_PERK_B_SLOT_INDEX = 4,    STATS_UPGRADE_C_SLOT_INDEX = 5,    UNIQUE_PERK_C_SLOT_INDEX = 6};IPerks.h#pragma once#include IPerk.h#include IComponent.h#include <vector>class IPerks : public IComponent{public:    IPerks(void);    virtual ~IPerks(void);    virtual void AddPerk(IPerk* perk, int column, int row) = 0;    virtual void RemovePerk(unsigned int index_1, unsigned int index2) =0;    virtual IPerk* GetPerk(unsigned int perkId) const = 0;};CommonPerks.cpp#include CommonPerks.h#include PerkSlotEnums.hCommonPerks::CommonPerks(void){    perkList.resize((int)PERK_SLOTS::COMMON_SLOT_COLUMNS);    perkList[(int)PERK_SLOTS::SCOPE_SLOT_INDEX].resize((int)PERK_SLOTS::COMMON_SCOPE_PERK_COUNT);}CommonPerks::~CommonPerks(void){}void CommonPerks::AddPerk(IPerk* perk, int column, int row){    perkList[column][row] = perk;}void CommonPerks::RemovePerk(unsigned int index_1, unsigned int index_2){    if(index_1 < perkList.size())    {        if(index_2 < perkList.at(index_1).size())        {            perkList.at(index_1).at(index_2) = nullptr;        }    }}IPerk* CommonPerks::GetPerk(unsigned int index_1, unsigned int index_2) const{    if(index_1 < perkList.size())    {        if(index_2 < perkList.at(index_1).size())        {            return perkList.at(index_1).at(index_2);        }    }    return nullptr;}
Possible class redundancy and improper enum usage
c++;game;inheritance;enum