考虑获取一个对象作为参数并打印其类型的问题:
#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>
; 在这种情况下,它会很有用。如何在 C++ 中使用模板制作类似的东西?
我以这种方式修改了代码:
#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