Неоднозначное преобразование в динамическом_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;
}

Это дает мне следующую ошибку :" Неоднозначное преобразование от производного класса '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

5
задан Michael Myers 6 April 2012 в 14:51
поделиться