C++ 为父类内的子类变量定义getter

C++ 为父类内的子类变量定义getter,c++,class,oop,polymorphism,parent-child,C++,Class,Oop,Polymorphism,Parent Child,我有一个项目,我正在使用指向父类的指针访问几个类。我需要知道指针所指的是哪个子类,因此我将向每个子类添加一个不同的整数ID号作为常量类变量 我需要使用指针访问这个变量,所以我为这个变量编写了一个getter函数。由于getter函数的代码对于所有子类都是相同的,所以我尝试在父类中定义该函数。这大致导致以下代码: class Parent { public: virtual void func(); // Getter function uint8_t getID()

我有一个项目,我正在使用指向父类的指针访问几个类。我需要知道指针所指的是哪个子类,因此我将向每个子类添加一个不同的整数ID号作为常量类变量

我需要使用指针访问这个变量,所以我为这个变量编写了一个getter函数。由于getter函数的代码对于所有子类都是相同的,所以我尝试在父类中定义该函数。这大致导致以下代码:

class Parent {
  public:
    virtual void func();

    // Getter function
    uint8_t getID() {
      return classID;
    }

    // Set ID to a default value
    const uint8_t classID = 0;
};

// One of many child classes
class A: public Parent {
  public:
    void func() {//do something}

    const uint8_t classID = 1;
};

int main(){
    Parent* childPointer = new A;
    uint8_t currentID = childPointer -> getID();
}
但是,运行此命令会导致
currentID
等于
Parent.classID
,而不是
A.classID


getID
函数设置为虚拟函数,并在每个子类中定义它,使其按预期工作,但这将导致大量重复代码。我想知道是否有办法在
父类中定义一次getter函数,并使其返回正确的值?否则,有更清洁的方法吗?在C++中,

< P>每个类都有自己的命名空间。在代码中,父命名空间中有一个classID,命名空间中有一个classID。所以A的每个实例实际上都有两个ClassID。getID()函数只在父命名空间中看到classID。这就是为什么它只返回0

更好的方法是定义构造函数,它将在父级中初始化classID:

#include <cstdint>

class Parent {
  public:
    Parent(): classID(0){}; //Default Parent initializes with 0
    Parent(uint8_t ID): classID(ID){}; //Constructor to be called by children

    virtual void func(){};

    // Getter function
    uint8_t getID() {
      return classID;
    };

    const uint8_t classID;
};

// One of many child classes
class A: public Parent {
  public:
    A(): Parent(1){}; //Every A calls Parent(uint8_t) constructor

    void func() {};//do something

    //const uint8_t classID = 1;  //This is not needed anymore
};

int main(){
    Parent* childPointer = new A;
    uint8_t currentID = childPointer -> getID();
}
#包括
班级家长{
公众:
Parent():classID(0){};//默认的父级使用0初始化
父(uint8_t ID):classID(ID){};//子级要调用的构造函数
虚void func(){};
//吸气剂函数
uint8_t getID(){
返回classID;
};
const uint8_t classID;
};
//许多儿童班中的一个
A类:公共家长{
公众:
A():Parent(1){};//每个A调用Parent(uint8\u t)构造函数
void func(){};//做点什么
//const uint8\u t classID=1;//这不再需要了
};
int main(){
父*childPointer=新A;
uint8_t currentID=childPointer->getID();
}