【发布时间】:2012-06-29 15:26:22
【问题描述】:
好的,我正在阅读 this entry in the FQA 处理将 Derived** 转换为 Base** 的问题以及为什么它被禁止,我知道问题是你可以分配给 Base* 一些东西这不是Derived*,所以我们禁止这样做。
到目前为止,一切都很好。
但是,如果我们深入应用这个原则,为什么我们不禁止这样的例子呢?
void nasty_function(Base *b)
{
*b = Base(3); // Ouch!
}
int main(int argc, char **argv)
{
Derived *d = new Derived;
nasty_function(d); // Ooops, now *d points to a Base. What would happen now?
}
我同意 nasty_function 做了一些愚蠢的事情,所以我们可以说允许这种转换很好,因为我们启用了有趣的设计,但我们也可以说双重间接:你得到了一个 Base **,但是你不应该对它的尊重分配任何东西,因为你真的不知道Base ** 来自哪里,就像Base * 一样。
那么,问题来了:那个额外的间接层级有什么特别之处?也许关键在于,只需要一层间接性,我们就可以使用虚拟operator= 来避免这种情况,而在普通指针上不能使用相同的机制?
【问题讨论】:
-
嗯,FQA/FAQ 不是完全按照您的要求回答了吗?
-
不是真的,因为他们没有指出你可以用普通指针做同样的把戏
标签: c++ pointers inheritance