Рассмотрим проблему получения объекта в качестве аргумента и вывода его типа:
#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;
}
Это дает мне следующую ошибку :" Неоднозначное преобразование от производного класса 'D' к базовому классу ».
Но я не понимаю, где двусмысленность:, если объект, объявленный в main(d), имеет тип D, почему его нельзя напрямую преобразовать в тип A?
Кроме того, если я передам аргумент строки типа, конечно, я получаю другие ошибки:
'std::basic_string<char>' is not polymorphic
В Java для обобщений есть синтаксис:<T extends A>
; в данном случае это было бы полезно. Как я могу сделать нечто подобное на С++ с помощью шаблонов?
Я изменил код таким образом:
#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;
}
Но я все равно получаю сообщение об ошибке:'std::basic_string<char>' is not polymorphic