Как узнать базовый класс производного класса C ?

#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)";
   }
 }
 

Демо: https://gcc.godbolt.org/z/TYdPzeMcT