【发布时间】:2013-10-21 18:20:15
【问题描述】:
我正在尝试通过基类虚函数获取对象的派生类型。我已经写了这个,它不会编译:
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;
}
...给我一个错误:我无法从base 初始化derived&。既然get_this 是虚拟的,为什么pd->get_this() 返回base& 而不是derived&?提前致谢!
编辑:
感谢大家的有用回答,并为我迟到的回复道歉。我应该在原始帖子中指定我也对我的问题的解决方案感兴趣,而不仅仅是弄清楚为什么上述内容无法编译。我的主要问题是 fn 是 derived 类独有的,不能通过基类调用。使用强制转换确实可以解决问题,但我讨厌使用 if else 构造来编写代码以获得正确的类型(Scott Meyers 也建议不要使用强制转换:))。答案似乎表明演员阵容是要走的路,这在某种程度上至少让人放心,我并没有忽视对我的问题的更“优雅”的解决方案。再次感谢!
【问题讨论】:
-
删除了我的答案,但我仍然相信 OP 使用简单的
dynamic_cast会更好,这对于所描述的用例来说将是一个可行的解决方案。没有其他人在答案中提到这一点,并且 C++ 中支持协方差的方式并不能解决 OP 的主要问题。 -
@g-makulik 嗯,是的,你可以(应该)删除或修改有争议的句子——其余的都是正确的,一个很好的答案。现在你已经把孩子和洗澡水一起扔了。
-
@KonradRudolph 给了另一个(省略了挑剔的词)。至少你是对的:当时的投票率低于声誉增益。但是我对否决票感到很紧张,经验表明,他们永远不会因为经过适当编辑的答案而被撤回。