关于函数参数类型隐式转换与子类类型问题,我与vs2003编译器的理解不同
先看下源代码,函数内容不用管,骗编译器的,只看接口。
编译环境:VS2003 7.1.3088
class A
{
};
class B
{
public:
operator A*() { return NULL; };
};
class C
{
public:
operator B() { B b; return b; };
};
class D : public A
{
};
class E
{
public:
operator D*() { return NULL; };
};
class F
{
public:
operator D() { D d; return d; };
};
void foo1(A* a) {};
void foo3(A a) {};
int main()
{
B b;
C c;
E e;
F f;
foo1(b); // 1
foo1(c); // 2
foo1(e); // 3
foo3(f); // 4
return 0;
}
首先,我知道的原则,编译器在匹配函数参数时,不会为你做2次隐式转换(记不清确切术语了,请原谅),因此,上面注释1的地方可以成功,注释2的地方会编译失败。这个没问题。
但是对于3和4,我就比较惊讶,特别是4。
对于3来说,存在隐式转换将e变成D*类型,但是foo1要求的是A*。 这个能编译通过,我姑且算作子类指针永远可以看成父类指针,因此不需要转换。
但是对于4来说,将f转换成D类型,居然就可以直接匹配A类型?
也许我对继承的理解有误?继承下来的子类,不必作任何转换就可以看作父类类型?这么说倒是也很合逻辑。。。
企盼达人解惑。