如this answer中所述:
高度依赖dynamic_cast通常表明您的设计出了问题。
我想知道的是如何在派生类中调用自定义函数,在基类中没有相同名称的函数,但是使用基类指针并且可能没有{{ 1}}如果实际上有更好的方法。
如果此功能是两者中定义的虚拟功能,那很容易。但这只是派生类中的一个独特函数。
也许dynamic_cast
是最好的方法吗?
答案 0 :(得分:5)
为了调用Derived
类的函数,你必须获得一个指向派生类的指针。作为一种选择(取决于具体情况),您可能希望使用static_cast
代替dynamic
,但正如您所说:
it is often an indication your design has gone wrong
另外,有时候我觉得使用强制转换是可以的。当我为游戏设计GUI库时,它有一个基类Widget
和许多子类。在编辑器中进行了实际的窗口布局,后来一些Loader
类正在使这个布局膨胀。为了从布局中填充小部件以及每个小部件数据的实际特定(与游戏相关),我提出了一种方法,用于从小部件中查询小部件的子节点。此函数将Widget*
重新调整为dynamic_casted
,然后将其Android
重新调整为实际类型。我还没有找到更好的设计。
后来我还发现{{1}}上的GUI系统的工作方式相同
答案 1 :(得分:1)
我想知道的是如何在派生类中调用自定义函数...如果实际上有更好的方法,则无
dynamic_cast
如引言所示,这是一个设计问题,而不是实施问题。调用该功能没有“更好的方法”; “更好的方法”是重新设计您的类型,以便子类型不需要向其父级添加功能。通过这样做,您的类型满足Liskov替换原则的(通用解释),并且更容易使用,因为用户根本不需要了解子类型。
如果以这种方式重新设计类型是不可能或不合理的,那么也许你确实需要RTTI。建议并没有说“所有使用...”,只是“高度依赖......”,这意味着RTTI应该是最后的手段,而不是默认方法。
答案 2 :(得分:0)
这更像是一个选项,然后是一个真正的答案,所以不要让我死。
class Derived;
class Base
{
public:
virtual Derived * getDerived()const
{
return NULL;
}
};
class Derived : public Base
{
public:
virtual Derived * getDerived()const
{
return this;
}
};
我想你得到的照片......
P.S。 Mike Seymour,谢谢: - )