我的编译器抱怨这一行:
LineLayer&安培; lastLayer = * this-> layers.back();
error: invalid initialization of reference of type ‘LineLayer&’ from expression of type ‘Layer’
所以他说,他不能初始化LineLayer& lastLayer reference from *this->layers.back()
,它是Layer *对象的一个向量(LineLayer的基类)。
取消引用指针并将其指定给子类的引用是不是没有问题?
答案 0 :(得分:2)
可以完成,但不能隐式。这是为了保护您免受不受欢迎的转换,因为并非每个Layer
都是LineLayer
。要在确定确认有效时执行此转化,请使用static_cast
:
LineLayer& lastLayer = static_cast<LineLayer&>(*this->layers.back());
如果您不确定Layer
是否为LineLayer
,请使用dynamic_cast
。如果不是std::bad_cast
,则会抛出LineLayer& lastLayer = dynamic_cast<LineLayer&>(*this->layers.back());
。
{{1}}
另一种方式---从派生到基础---不需要演员,而是隐式执行,因为它是一种安全的转换。
答案 1 :(得分:0)
“取消引用指针并将其指定给子类的引用是不是没有问题”?子类???不,当然,它不应该是“好的”。你怎么知道那个指针最初是否指向该子类的对象?也许它指的是一个完全不同的子类的对象。在这种情况下,您认为它如何运作?
如果您确定目标对象具有正确的子类类型,则必须明确告诉编译器您确实要执行此危险转换。您必须使用static_cast
强制转换。或者,如果基类是多态的,则可以使用dynamic_cast
。
当然,这里真实的(隐含的)问题是你为什么要这样做。你真的需要LineLayer &
类型的参考吗?或者,也许,Layer &
类型的引用也可以正常工作?没有办法从你发布的内容中回答这个问题。