次の C++ プログラムについて:
class Base { };
class Child : public Base { };
int main()
{
// Normal: using child as base is allowed
Child *c = new Child();
Base *b = c;
// Double pointers: apparently can't use Child** as Base**
Child **cc = &c;
Base **bb = cc;
return 0;
}
GCC は、最後の割り当てステートメントで次のエラーを生成します。
error: invalid conversion from ‘Child**’ to ‘Base**’
私の質問は2つの部分に分かれています:
- Child** から Base** への暗黙的な変換がないのはなぜですか?
- この例は、C スタイルのキャストまたは
reinterpret_cast
. これらのキャストを使用することは、すべての型の安全性を捨てることを意味します。これらのポインターを暗黙的にキャストするために、または少なくともstatic_cast
代わりに使用できるように変換を表現するために、クラス定義に追加できるものはありますか?