О наследовании в ООП. Как узнать имя производного класса из базового? Добрый день! Есть базовый класс и n-ное количество производных. Базовый класс - абстрактный (но это не важно), при этом предоставляет не виртуальную функцию.class Base() { ... void f(); ... } class Der1(): public Base { ... } class Der2(): public Base { ... } Взаимодействие с производными классами происходит через указатель на базовый класс:Base* base = new Der1; base->f(); При таком раскладе, есть ли какой-то способ отловить, какой базовый класс (желательно имя класса в строковом виде) вызвал функцию f()?
В C++ нет встроенного механизма для получения имени класса в виде строки. Однако, можно использовать ряд различных методов для реализации подобного функционала. Например, можно добавить в базовый класс виртуальный метод getName(), который каждый производный класс будет переопределять, возвращая свое имя в виде строки.
Пример:
#include <iostream> #include <typeinfo> // для typeid class Base { public: virtual std::string getName() const = 0; void f() { std::cout << "Calling f() from class " << getName() << std::endl; } }; class Der1 : public Base { public: std::string getName() const override { return "Der1"; } }; class Der2 : public Base { public: std::string getName() const override { return "Der2"; } }; int main() { Base* base = new Der1; base->f(); delete base; return 0; }
Таким образом, выполнив программу, мы получим вывод "Calling f() from class Der1". В этом примере метод getName() возвращает имя производного класса в виде строки.
Также можно использовать дополнительные методы, такие как использование макросов, рефлексии или внешних инструментов для получения имени класса в виде строки, но они часто требуют дополнительного кода и/или наличия сторонних библиотек.
В C++ нет встроенного механизма для получения имени класса в виде строки. Однако, можно использовать ряд различных методов для реализации подобного функционала. Например, можно добавить в базовый класс виртуальный метод getName(), который каждый производный класс будет переопределять, возвращая свое имя в виде строки.
Пример:
#include <iostream>#include <typeinfo> // для typeid
class Base
{
public:
virtual std::string getName() const = 0;
void f()
{
std::cout << "Calling f() from class " << getName() << std::endl;
}
};
class Der1 : public Base
{
public:
std::string getName() const override
{
return "Der1";
}
};
class Der2 : public Base
{
public:
std::string getName() const override
{
return "Der2";
}
};
int main()
{
Base* base = new Der1;
base->f();
delete base;
return 0;
}
Таким образом, выполнив программу, мы получим вывод "Calling f() from class Der1". В этом примере метод getName() возвращает имя производного класса в виде строки.
Также можно использовать дополнительные методы, такие как использование макросов, рефлексии или внешних инструментов для получения имени класса в виде строки, но они часто требуют дополнительного кода и/или наличия сторонних библиотек.