わかりました、aを aに変換する問題と、それが禁止されている理由について扱っている FQA のこのエントリを読んでいましたが、問題は 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
私はそれがばかげたことをすることに同意します。興味深いデザインを可能にするので、その種の変換を許可することは問題ないと言えますが、二重間接化についても言えBase **
ます。Base **
のように、それがどこから来るのか本当にわからないからですBase *
。
では、問題は、この追加レベルの間接化の特別な点は何ですか? おそらく要点は、1 レベルの間接化だけで、それoperator=
を回避するために virtual で遊ぶことができるということですが、同じ機構はプレーン ポインターでは利用できないのでしょうか?