包装类型的铸造

Wrapped Type Casting

本文关键字:类型 包装类 包装      更新时间:2023-10-16

有人可以帮助我理解为什么该代码编译:

class A {};
class B : public A {};
void foo( A ) {}

int main() {
  B b;
  foo( b );
}

但这不是:

class A {};
class B : public A {};
template< typename T >
class wrapper {};
void foo( wrapper<A> ) {}
int main() {
  wrapper<B> b;
  foo( b );
}

第二个代码(即未编译的代码)中的唯一区别是,AB类被包装为类wrapper中的模板参数;令人惊讶的是,包装似乎阻碍了从BA的转换。

如果有人可以帮助我修复第二个代码,那也很棒。

class B均来自 class A,因此每个 B is is a A均可用于其位置。但是,wrapper<A>wrapper<B>没有关系 - 为什么会?

考虑此示例:如果B是A的儿子,B的妻子将是A妻子的儿子(显然不是 - 他们没有关系)。

要完成这样的关系,您需要从wrapper<A>派生wrapper<B>,而wrapper<>是模板类是不可能的。考虑其他方法,在其中将B发送到wrapper<A>类或类似方法的方法(工作,如是 a A)。