我想将基类指针向下转换为派生类指针。
我知道动态强制转换是昂贵的,所以我想避免它。在我的例子中,我完全知道所讨论的指针所指向的实际类。是否有一种比动态铸造更快的方法来向下铸造它?
我试图使用static_cast
,但它不会适用于这里,因为有虚拟继承在我的类层次。
更新:
谢谢你的评论,我现在意识到那些动态强制转换不太可能成为整个程序的瓶颈,所以试图优化它几乎是浪费时间。
似乎这正是虚方法的作用。适当使用虚方法可以消除对动态强制转换的大部分需求。它甚至可以用于虚拟继承。
#include <stdexcept>
#include <iostream>
class Derived;
class Base {
public:
virtual Derived *to_derived()
{
throw std::runtime_error("Nope");
}
};
class Derived : virtual public Base {
public:
Derived *to_derived() override
{
return this;
}
};
class DerivedAgain : public Derived
{
};
int main()
{
DerivedAgain kit_and_kaboodle;
Base *p=&kit_and_kaboodle;
std::cout << (p->to_derived() ? "it worksn":"no it doesn'tn");
return 0;
}
如果需要,为const正确性添加一个const
重载。
reinterpret_cast<>
是在没有任何动态检查的情况下将下降的基本问题的答案。这是c型类型中最强(即最不安全)的类型。