У меня есть проект, в котором я обращаюсь к нескольким классам, используя указатель на родительский класс. Мне нужно знать, на какой дочерний класс ссылается указатель, поэтому я добавляю отдельный целочисленный идентификационный номер к каждому из них как переменную класса констант.
Мне нужен доступ к этой переменной с помощью указателя, поэтому я написал функцию получения для этой переменной. Поскольку код функции-получателя был бы одинаковым для всех дочерних классов, я попытался определить функцию в родительском классе. Это примерно приводит к коду, найденному ниже:
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
Функция virtual и определение ее в каждом из дочерних классов сделали ее работающей так, как задумано, но это привело бы к частичному повторению кода. Мне было интересно, есть ли способ определить функцию-получатель один раз в классе Parent
и заставить ее вернуть правильное значение? Иначе, есть ли более чистый способ сделать это?