Betrachten Sie das Problem ein Objekt als Argument bekommen und den Druck seiner Art:Mehrdeutige Umwandlung in dynamic_cast
#include <iostream>
class A { };
class B : public A { };
class C : public A { };
class D : public C, public B { };
using namespace std;
template<class T>
void print_type(T* info)
{
if(dynamic_cast<D*>(info))
cout << "D" << endl;
else if(dynamic_cast<C*> (info))
cout << "C" << endl;
else if(dynamic_cast<B*>(info))
cout << "B" << endl;
else if(dynamic_cast<A*> (info))
cout << "A" << endl;
}
int main(int argc, char** argv)
{
D d;
print_type(&d);
return 0;
}
Es gibt mir die folgende Fehlermeldung: "Mehrdeutige Umwandlung von abgeleiteten Klasse‚D‘auf der Basisklasse. "
Aber ich sehe nicht, wo die Mehrdeutigkeit ist: Wenn das in main (d) deklarierte Objekt vom Typ D ist, warum kann es nicht direkt in einen Typ A konvertiert werden?
Auch, wenn ich ein Argument vom Typ String natürlich passieren erhalte ich Fehler:
'std::basic_string<char>' is not polymorphic
In Java für Generika gibt es die Syntax: <T extends A>
; in diesem Fall wäre es nützlich. Wie kann ich eine ähnliche Sache in C++ mit Vorlagen machen?
Ich habe den Code auf diese Weise geändert:
#include <iostream>
#include <vector>
class A { };
class B : virtual public A { };
class C : virtual public A { };
class D : public C, public B { };
using namespace std;
template<class T>
void print_type(T* info)
{
if(dynamic_cast<D*>(info))
cout << "D" << endl;
else if(dynamic_cast<C*> (info))
cout << "C" << endl;
else if(dynamic_cast<B*>(info))
cout << "B" << endl;
else if(dynamic_cast<A*> (info))
cout << "A" << endl;
}
int main(int argc, char** argv)
{
string str;
print_type(&str);
return 0;
}
Aber ich bekomme immer noch den Fehler: 'std::basic_string<char>' is not polymorphic
Ich nehme an, dies ist nur ein anschauliches Beispiel, kein realer Code? Das ist natürlich genau das, was mit Polymorphie gelöst wird. –
Es ist nicht illustrativ, aber ich habe diesen Code ausprobiert, um zu sehen, wie dynamic_cast funktioniert. –
@RamyAlZuhouri Siehe [MSDN] (http://msdn.microsoft.com/en-us/library/4k5yex0s%28v=vs.71%29.aspx) darüber. "Sie können dynamic_cast nicht verwenden, um von einer nicht-polymorphen Klasse (eine Klasse ohne virtuelle Funktionen) zu konvertieren." – MPelletier