使用基类指针在派生类中调用非虚函数

时间:2013-05-15 13:45:43

标签: c++ polymorphism

this answer中所述:

  

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

我想知道的是如何在派生类中调用自定义函数,在基类中没有相同名称的函数,但是使用基类指针并且可能没有{{ 1}}如果实际上有更好的方法。

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

也许dynamic_cast是最好的方法吗?

3 个答案:

答案 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,谢谢: - )