好的,我正在阅读这篇FQA中的条目,涉及将Derived**
转换为Base**
的问题以及为什么它是被禁止的。我明白问题在于你可能会将一个不是Derived*
的东西赋值给Base*
,因此我们禁止了这种情况。
到目前为止,一切顺利。
但是,如果我们深入应用这个原则,为什么我们不禁止这样的例子呢?
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=
进行操作,以避免这种情况,而在普通指针上没有相同的机制可用?