我正在尝试通过基类虚函数获取对象的派生类型。我写了这个,它不会编译:
struct base {
virtual base& get_this() {
return *this;
}
};
struct derived : base {
virtual derived& get_this() override {
return *this;
}
void fn();
};
int main () {
base* pd = new derived();
derived& x = pd->get_this(); /*ERROR*/
x.fn();
return 0;
}
...给我一个错误:我无法derived&
从 a 初始化 a base
。既然get_this
是虚拟的,为什么要pd->get_this()
返回 abase&
而不是 a derived&
?提前致谢!
编辑:
感谢大家提供有用的答案,并为我迟到的回复道歉。我应该在原始帖子中指定我也对我的问题的解决方案感兴趣,而不仅仅是弄清楚为什么上述内容无法编译。我的主要问题是该类fn
是唯一的,derived
不能通过基类调用。使用强制转换确实可以解决问题,但我讨厌使用 if else 构造编写代码只是为了获得正确的类型(Scott Meyers 也建议不要使用强制转换:))。答案似乎表明演员阵容是要走的路,这在某种程度上至少让人放心,我并没有忽视对我的问题的更“优雅”的解决方案。再次感谢!