今天我尝试了一些东西,认为它不会起作用,但它确实有效,我无法理解为什么......
我有一个base
类型的对象,其中不包含任何内容
另一个继承自derived
的{{1}}类型,存储一个函数指针并调用它
base
是一个模板对象,其参数是存储函数等待的参数类型。
如果我从derived
类型的对象中引用类型base
,并尝试将其转换为derived<void>
...它确实有效。
你如何解释它,因为derived<int>
和derived<>
是两种不同的类型?
一个简单的例子:
derived< int >
感谢您的帮助。
答案 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&
。