如本答案所述:
对 dynamic_cast 的高度依赖通常表明您的设计出了问题。
我想知道的是如何在派生类中调用自定义函数,基类中没有同名函数,但是使用基类指针进行调用,dynamic_cast
如果实际上没有更好的方法。
如果这个函数是两者中定义的虚函数,那很容易。但这只是派生类中独有的功能。
也许dynamic_cast
毕竟是最好的方法?
如本答案所述:
对 dynamic_cast 的高度依赖通常表明您的设计出了问题。
我想知道的是如何在派生类中调用自定义函数,基类中没有同名函数,但是使用基类指针进行调用,dynamic_cast
如果实际上没有更好的方法。
如果这个函数是两者中定义的虚函数,那很容易。但这只是派生类中独有的功能。
也许dynamic_cast
毕竟是最好的方法?
为了调用Derived
类的函数,您必须获得指向派生类的指针。作为一个选项(取决于情况),您可能希望使用static_cast
而不是dynamic
,但正如您所说:
it is often an indication your design has gone wrong
另外,有时我认为使用 casts 是可以的。当我为游戏设计 GUI 库时,它有一个基类Widget
和许多子类。一个实际的窗口布局是在编辑器中制作的,后来一些Loader
类正在夸大这个布局。为了从布局中填充每个小部件数据(游戏相关)的实际特定小部件,我制作了一种从小部件中查询小部件子级的方法。此功能重新调整Widget*
,然后我dynamic_casted
将其调整为实际类型。我还没有找到更好的设计。
后来我还发现GUI系统的Android
工作方式相同
我想知道的是如何在派生类中调用自定义函数......
dynamic_cast
如果实际上没有更好的方法
如报价中所述,这是一个设计问题,而不是实施问题。没有“更好的方法”来调用该函数;“更好的方法”是重新设计你的类型,这样子类型就不需要向它们的父类添加功能。通过这样做,您的类型满足(常见的解释)Liskov 替换原则,并且更易于使用,因为用户根本不需要了解子类型。
如果以这种方式重新设计类型是不可能或非常困难的,那么也许您确实需要 RTTI。该建议没有说“所有使用...”,只是“高度依赖...”,这意味着 RTTI 应该是最后的手段,而不是默认方法。
这更像是一个选项而不是一个真正的答案,所以不要用石头砸死我。
class Derived;
class Base
{
public:
virtual Derived * getDerived()const
{
return NULL;
}
};
class Derived : public Base
{
public:
virtual Derived * getDerived()const
{
return this;
}
};
估计你看懂图了。。。
PS迈克西摩,谢谢:-)