如果一个类继承多个基类,而且这些基础继承相同的基类,则进行类型转换时,如果转换成相同的父类型,编译时会产生二义性错误:
class A
{
virtual void test(){} ;
} ;
class B : public A {} ;
class C : public A {} ;
class D: public B, public C {} ;
D *pa = new D() ;
A *pb = (A*)(pa) ;
以上代码编译时产生以下错误提示:
error C2594: 'type cast' : ambiguous conversions from 'D *' to 'A *'
即不支持将D*指针类型强制转换成A*类型,需要选择一个更为精确的类型进行转换,如
A *pb = (B*)(pa) ;
或
A *pb = (C*)(pa) ;
两种转换都合法,但一般使用最左边的基类,大多数编译器产生的代码效率会高一些。