好的,我正在阅读FQA 中关于将 a 转换为 a以及为什么禁止它的问题的这个条目,我知道问题是你可以分配一个不是 a 的东西,所以我们禁止这样做。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
做是愚蠢的,所以我们可以说让这种转换很好,因为我们启用了有趣的设计,但我们也可以说对于双重间接:你有 a Base **
,但你不应该给它分配任何东西尊重,因为你真的不知道它Base **
来自哪里,就像Base *
.
那么问题来了:这个额外的间接层级有什么特别之处?也许关键是,只有一层间接,我们可以玩 virtualoperator=
来避免这种情况,而相同的机制在普通指针上不可用?