2 Stimmen

Weiterleitungserklärung und typeid

Ich würde gerne den Typ einer Superklasse überprüfen A gegen den Typ einer Unterklasse B (mit einer Methode innerhalb der Oberklasse A , so dass B erben wird).

Hier ist, was ich dachte, hat den Trick gemacht (d.h. die Verwendung der Vorwärtserklärung):

#include <iostream>
#include <typeinfo>

using namespace std;

class B;

class A {
  public:
    int i_;
    void Check () {
      if (typeid (*this) == typeid (B))
        cout << "True: Same type as B." << endl;
      else
        cout << "False: Not the same type as B." << endl;
    }
};

class B : public A {
  public:
    double d_;
};

int main () {

  A a;
  B b;

  a.Check (); // should be false
  b.Check (); // should be true

  return 0;
}

Dieser Code lässt sich jedoch nicht kompilieren. Der Fehler, den ich bekomme, ist:

main.cc: In member function ‘void A::Check()’:
main.cc:12: error: invalid use of incomplete type ‘struct B’
main.cc:6: error: forward declaration of ‘struct B’

Wie könnte ich dieses Problem lösen?

0voto

Arnaud Punkte 1

Hallo, selbst wenn Sie die Definition von A::Check außerhalb der Klasse setzen, wird das Ergebnis nicht das sein, was Sie erwarten. Das liegt daran, dass das B-Objekt in der Methode in ein A-Objekt umgewandelt wird, so dass diese auf ein A-Objekt zeigt und die typeids immer unterschiedlich sind. Um dies zu lösen, deklarieren Sie die Methode als virtuell.

Allerdings verstehe ich immer noch nicht, warum Sie einen solchen Test durchführen wollen O_o ? Und wie CAdaker sagte, ist das keine gute Praxis

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X