#c
Вопрос:
Предположим , у меня есть базовый класс A
и два абстрактных класса B
и C
, а также их производный класс D
и E
.
Как я могу отличить D
и E
класс последнего слоя? ( D
последний класс слоя — это B
, E
это C
)
Вот код:
#include <iostream>
using namespace std;
class ClassA { public: virtual int testFunc() { return 1; } };
class ClassB : public ClassA { public: virtual int testFunc() override =0; };
class ClassC : public ClassA { public: virtual int testFunc() override =0; };
class D : public ClassB { public: virtual int testFunc() override {return 2;} };
class E : public ClassC { public: virtual int testFunc() override {return 3;} };
int main() {
ClassA * d = new D();
ClassA * e = new E(); // !!! how can i know e's last layer class C by pointer e?????
if (somemethod(*e) == somemethod(ClassC)) { // somemethod is what i want
// do something
} else {
// do something
}
}
Я знаю typeid
, что это может помочь в этом , но вывод кода должен быть D
и E
, как я могу узнать их последний класс слоя?
Комментарии:
1. Не уверен, что это то, что вам нужно, но вы можете попробовать
dynamic_cast
ввестиA*
указатель вB*
илиC*
.2. @interjay мне просто нужно судить об их типе класса, моя цель:
if (somemethod(*e) == somemethod(ClassC)) .....
3. Это похоже на проблему XY . Если вы правильно выполняете полиморфизм, не должно иметь значения, что такое «последний слой».
4. предложение Интерджея, похоже, делает свое дело:
if (auto* c = dynamic_cast<ClassC*>(e))
.5. Если вам нужно знать, что это означает, что вы неправильно используете полиморфизм. Весь смысл ООП заключается в том, что вам не нужно знать детали используемого объекта. Если вам нужно выполнить проверку типов, это обычно означает, что абстракции (интерфейсы) спроектированы неправильно.
Ответ №1:
Это уже есть в комментариях, вы можете использовать dynamic_cast
в качестве замены somemethod
в своем коде следующим образом:
#include <iostream>
using namespace std;
class ClassA { public: virtual int testFunc() { return 1; } };
class ClassB : public ClassA { public: virtual int testFunc() override =0; };
class ClassC : public ClassA { public: virtual int testFunc() override =0; };
class D : public ClassB { public: virtual int testFunc() override {return 2;} };
class E : public ClassC { public: virtual int testFunc() override {return 3;} };
int main() {
//ClassA * d = new D();
ClassA * e = new E();
if ( dynamic_cast<ClassC*>(e) ) {
std::cout << "classC is among (e) parents";
} else {
std::cout << "classC is not a parent of (e)";
}
}