1

本答案所述:

对 dynamic_cast 的高度依赖通常表明您的设计出了问题。

我想知道的是如何在派生类中调用自定义函数,基类中没有同名函数,但是使用基类指针进行调用,dynamic_cast如果实际上没有更好的方法。

如果这个函数是两者中定义的虚函数,那很容易。但这只是派生类中独有的功能。

也许dynamic_cast毕竟是最好的方法?

4

3 回答 3

5

为了调用Derived类的函数,您必须获得指向派生类的指针。作为一个选项(取决于情况),您可能希望使用static_cast而不是dynamic,但正如您所说:

it is often an indication your design has gone wrong

另外,有时我认为使用 casts 是可以的。当我为游戏设计 GUI 库时,它有一个基类Widget和许多子类。一个实际的窗口布局是在编辑器中制作的,后来一些Loader类正在夸大这个布局。为了从布局中填充每个小部件数据(游戏相关)的实际特定小部件,我制作了一种从小部件中查询小部件子级的方法。此功能重新调整Widget*,然后我dynamic_casted将其调整为实际类型。我还没有找到更好的设计。

后来我还发现GUI系统的Android工作方式相同

于 2013-05-15T13:48:40.627 回答
1

我想知道的是如何在派生类中调用自定义函数......dynamic_cast如果实际上没有更好的方法

如报价中所述,这是一个设计问题,而不是实施问题。没有“更好的方法”来调用该函数;“更好的方法”是重新设计你的类型,这样子类型就不需要向它们的父类添加功能。通过这样做,您的类型满足(常见的解释)Liskov 替换原则,并且更易于使用,因为用户根本不需要了解子类型。

如果以这种方式重新设计类型是不可能或非常困难的,那么也许您确实需要 RTTI。该建议没有说“所有使用...”,只是“高度依赖...”,这意味着 RTTI 应该是最后的手段,而不是默认方法。

于 2013-05-15T14:00:13.060 回答
0

这更像是一个选项而不是一个真正的答案,所以不要用石头砸死我。

class Derived;

class Base
{
public:

   virtual Derived * getDerived()const
   {
       return NULL;
   }
};

class Derived : public Base
{
public:

   virtual Derived * getDerived()const
   {
       return this;
   }
};

估计你看懂图了。。。

PS迈克西摩,谢谢:-)

于 2013-05-15T14:08:53.657 回答