使用不同的模板参数投射模板对象,这怎么可能?

时间:2015-04-15 17:42:25

标签: c++ templates inheritance casting

今天我尝试了一些东西,认为它不会起作用,但它确实有效,我无法理解为什么......

我有一个base类型的对象,其中不包含任何内容 另一个继承自derived的{​​{1}}类型,存储一个函数指针并调用它 base是一个模板对象,其参数是存储函数等待的参数类型。

如果我从derived类型的对象中引用类型base,并尝试将其转换为derived<void> ...它确实有效。
你如何解释它,因为derived<int>derived<>是两种不同的类型?

一个简单的例子:

derived< int >

You can test it here.

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

忘掉模板。

您有一个课程A,一个来自B的课程A,以及一个源自C的课程A

如果您的左值为A,则可以将其转换为B &C &。编译器通常无法知道具体派生类型是什么,因此它相信您知道自己在做什么。

这正是您正在做的事情:您将A投射到B &。您的A实际上是C对象,但编译器不知道。

答案 1 :(得分:2)

考虑一下:

struct X {};
struct A : X {};
struct B : X {};

X & x = get_object_ref(); //can return A& or B&, how would I know?

A & a = static_cast<A&>(x); //this will compile!
B & b = static_cast<B&>(x); //this will compile too!

如果static_cast<A&>(x)出错,那么static_cast<B&>(x)也应该通过对称来提供错误。因为必须编译,所以都必须编译。

底线:base&始终可以下载到derive& - 这是一种语言功能。您有责任加入正确的 derive&