在多重继承中从派生类函数调用适当的父类函数

时间:2018-06-01 09:08:15

标签: c++ inheritance multiple-inheritance

假设我有以下类:

class Base {
  virtual void func() { cout << "func base" << endl; }
};

class A : virtual public Base {
  public:
  virtual void func() { cout << "func A" << endl; }
};

class B : virtual public Base {
  public:
  virtual void func() { cout << "func B" << endl; }
};

class C : public A, public B {
  C(bool is_a);
  public:
  virtual void func() { // Call appropriate parent's func here }
};

我的要求是当我调用C func()时调用适当的父类'function func()。这就是我的意思:

Base* ptr = new C(true /*is_a*/);
ptr->func(); // This should call A's func internally

如何实现这一目标?它甚至可能吗?

[编辑]

这可能更像是一个设计问题。众所周知,C类只有一个真正的父(A或B)。并且取决于哪个是父,我希望调用该函数。欢迎任何替代设计建议。

我从A和B派生C,因为有一些共同的功能,A和B共享,哪些不能成为基类的一部分。

2 个答案:

答案 0 :(得分:6)

您需要明确调用A::func()

class C : public A, public B {
  public:
  virtual void func() { A::func(); }
};

更新(给你):

你真的想要实现什么?您想解决一个实际问题吗?

如果你知道“C类只有一个真正的父母”,为什么你需要首先从 A和B 派生出来?即使Aconcagua's answer有效,它看起来更像是一个没有在您身边正确陈述的问题的解决方法。如果您正在处理类的不同实现,您不想使用某种模式(例如bridgestrategy模式)吗?

答案 1 :(得分:3)

  

这可能更像是一个设计问题。众所周知,C类只有一个真正的父(A或B)。并且取决于哪个是父,我希望调用该函数。欢迎提出任何其他设计建议。

class Base { };
class A : public Base { };
class B : public Base { };
class C
{
    // common interface for all types of C
};

class C_A : public A, public C { };
class C_B : public B, public C { };

现在,您可以使用C_AC需要表现为AC_B类似......

在上面的示例中,删除了所有虚拟继承,不需要它们。根据用例,让类C本身从Base继承可能适合也可能不适合。如果是这样,请让所有ABC从Base继承。但是,C_AC_B不需要从父母那里继承(由于基类的虚拟继承,仍然会有一个Base实例继承。)