Если Derived
является единственным конкретным экземпляром Base
, вы можете использовать вместо него static_cast
.
Лично я определяю функцию, например, MyCast
для каждого специализированного класса.Я определяю четыре перегруженных варианта, чтобы я мог понижать константные и неконстантные указатели и ссылки.Например:
inline Derived * MyCast(Base * x) { return static_cast<Derived *> (x); }
inline Derived const * MyCast(Base const * x) { return static_cast<Derived const *>(x); }
inline Derived & MyCast(Base & x) { return static_cast<Derived &> (x); }
inline Derived const & MyCast(Base const & x) { return static_cast<Derived const &>(x); }
И также для Derived2 и Base2.
Большим преимуществом наличия всех четырех является то, что вы не сможете случайно изменить константу и можете использовать одну и ту же конструкцию независимоесли у вас есть указатель или ссылка.
Конечно, вы можете заменить static_cast
на макрос и использовать dynamic_cast
в режиме отладки, а static_cast
- в режиме выпуска.
Кроме того, приведенный выше код можно легко обернуть в макрос, что упрощает пакетное определение функций.
Используя этот шаблон, вы можете реализовать свой код следующим образом:
class Derived : public Base
{
public:
virtual void func2()
{
base2_obj = new Derived2();
}
void DerivedFunc()
{
MyCast(base2_obj)->Derived2Func();
}
}