0

假设我有一个基类B,派生类D,派生派生类DD。如何获取当前对象的直接父级实例?

例如

DD dd;
if (condition )
  dd->myfunction();
else
  d = getcurrentparent(); // this should give the current parent, here D d;

编辑:

好的,我正在添加我的场景。

它就像一个菜单。每个菜单都是不同的类别。

主菜单-基类子菜单-派生类子子菜单-派生派生类。

现在当我在子子菜单中遍历时,我需要知道当前 obj 的直接父级(比如从子子菜单返回到子菜单)

4

3 回答 3

2

如果你有DD dd;,你总是可以通过分配一个引用来获得对它的任何基类的引用:

DD dd;
D& d = dd;

我不确定您为什么要这样做,因为派生对象可以做基础对象可以做的所有事情(以及更多)。

于 2012-11-01T10:47:44.023 回答
1

试试这样的,

class D : public B
{
   virtual const char * GetParent()
   {
       return "B";
   }

    // other stuff....
}

class DD : public D
{
   virtual const char * GetParent()
   {
       return "D";
   }

   // other stuff....
}

我希望这是你想要的。你为什么需要这样的东西?您是否正在创建类似具有层次结构的对象注册表或类似的东西?

- 编辑 -

D * d = ⅆ 或者如果你真的想要,创建一个复制函数,将 DD 对象复制到 D 对象。但我猜是你没有正确地问你的问题。

ps对不起,我第一次读错了这个问题。

- 编辑 -

好的,您需要的是复合设计模式。如 UML 图所示,它不是很复杂。一旦你实现了它,就很容易编写你的其他东西。谈到设计模式时,我喜欢《傻瓜设计模式》这本书。它很好地解释了设计模式,并且很好地解释了复合设计模式。如果您需要帮助,请发表评论询问。但首先尝试自己做。:) 请享用。维基百科链接:http ://en.wikipedia.org/wiki/Composite_pattern

--EDIT-- Composite DP是这样的, 复合设计模式

假设您的场景是控制台上的一个非常简单的菜单,我会这样做,

  • Leaf==>MenuItem
  • Composite==>Menu
  • +operation()==>Select()两个类的功能。这个函数应该是虚拟的,并且在Menu类和MenuItem类中被覆盖,以分别显示/展开选择项目
  • Menu类将具有GoBack()到父菜单的功能
于 2012-11-01T11:04:07.657 回答
1

不是一个好主意。您可以执行上面的建议,但这不是一个好的设计选择。此外,在多重继承(或多个接口)的情况下,您想要什么父级?

于 2012-11-01T11:07:22.460 回答