Кажется, что существует способ проверить правильность CRPT во время компиляции.
Делая Base абстрактной (добавляя в Base некоторый чистый виртуальный метод), мы гарантируем, что любой экземпляр Base является частью некоторого производного экземпляра.,
Делая все конструкторы Base частными, мы можем предотвратить нежелательное наследование от Base.
Объявляя Derived как друга Base, мы разрешаем единственное наследование, ожидаемое CRPT.
После этого, Преобразование CRPT должно быть правильным (поскольку что-то наследуется от базы, и это «что-то» может быть только производным, а не каким-то другим классом)
Возможно, для практического использования первый шаг (создание абстрактного объекта Base) является избыточным, поскольку успешныйstatic_cast гарантирует, что Derived находится где-то в базовой иерархии.Это допускает только экзотическую ошибку, если Derived наследуется от Base <Derived>
(как ожидает CRPT), но в то же время Derived создает другой экземпляр Base <derived>
(без наследования) где-то в производном коде (может, потому что он друг),Однако я сомневаюсь, что кто-то может случайно написать такой экзотический код.