Столкнулся с этим сегодня:
/// <summary>
/// The Page_Load runs when the page loads
/// </summary>
private void Page_Load(Object sender, EventArgs e) {}
Полагаю, вы используете boost :: shared_ptr
... Я думаю, вам нужен dynamic_pointer_cast
или shared_polymorphic_downcast
.
Однако для этого требуются полиморфные типы.
что это за тип
Base * const
?const Base *
Я понимаю, ноBase * const
? На что в этом случае ссылаетсяconst
?
const Base *
- это изменяемый указатель на константу Base
. Base const *
- это изменяемый указатель на константу Base
. Base * const
- это постоянный указатель на изменяемый Base
. Base const * const
является константой указатель на константу Base
. Вот минимальный пример:
struct Base { virtual ~Base() { } }; // dynamic casts require polymorphic types
struct Derived : public Base { };
boost::shared_ptr<Base> base(new Base());
boost::shared_ptr<Derived> derived;
derived = boost::static_pointer_cast<Derived>(base);
derived = boost::dynamic_pointer_cast<Derived>(base);
derived = boost::shared_polymorphic_downcast<Derived>(base);
I ' m не уверен, было ли это намеренно, что ваш пример создает экземпляр базового типа и приводит его, но он служит для хорошей иллюстрации разницы.
static_pointer_cast
будет «просто делать это». Это приведет к неопределенному поведению ( Derived *
, указывающему на память, выделенную и инициализированную Base
) и, вероятно, вызовет сбой или что-то еще хуже. Счетчик ссылок на базе
будет увеличиваться.
dynamic_pointer_cast
приведет к нулевому указателю. Счетчик ссылок на base
не изменится.
shared_polymorphic_downcast
будет иметь тот же результат, что и статическое приведение, но вызовет утверждение, которое, скорее, будет успешным и приведет к неопределенному поведение. Счетчик ссылок на базе
будет увеличиваться.
См. (мертвая ссылка) :
Иногда немного сложно решить, использовать ли
static_cast
] илиdynamic_cast
, и вы хотели бы иметь немного обоих миров. Хорошо известно, что у dynamic_cast накладные расходы времени выполнения, но это безопаснее, тогда как static_cast вообще не имеет накладных расходов, но может молча выйти из строя. Как было бы хорошо, если бы вы могли использоватьshared_dynamic_cast
в отладочных сборках иshared_static_cast
в сборках выпуска. Что ж, такая штука уже доступна и называетсяshared_polymorphic_downcast
.