【发布时间】:2015-04-16 09:20:29
【问题描述】:
我的课是
-
BaseDerived_ADerived_B
-
ParentChild_OneChild_Two
Base 有两个签名函数:
virtual void foo( const Parent& ) = 0;
virtual void bar( const Base& ) = 0;
,程序的其他部分所期望的。
问题是:
Derived_A 对待 Child_One 和 Child_Two 相同。但是Derived_B 对待它们的方式不同。
我应该如何实现这个?
一种方法是找出传递给Derived_B.foo 的对象类型。这显然是“设计缺陷”。
我尝试的另一种方法是将签名函数更改为:
class Base
{
class Derived_A;
class Derived_B;
// virtual void bar( const Base& ) = 0;
virtual void bar( const Derived_A& ) = 0;
virtual void bar( const Derived_B& ) = 0;
}
class Derived_A: public virtual Base
{
virtual void foo( const Parent& ) = 0;
}
class Derived_B: public virtual Base
{
virtual void foo( const Child_A& ) = 0;
virtual void foo( const Child_B& ) = 0;
}
但是现在bar 函数不能使用Base.foo。所以我要写两次bar函数,虽然代码完全一样。
还有其他方法可以解决这个问题吗?你推荐哪一个?
附:我想不出一个好的标题。请随意修改。
【问题讨论】:
-
您不能将
Parent的子代传递给foo(Parent)。您只能传递Parent实例。见stackoverflow.com/questions/274626/what-is-object-slicing你需要多态的引用或指针。 -
查看访问者设计模式。
-
我实际上在我的程序中使用了引用。我试图简化它,但做得过火了。