虚拟功能实现和多重继承

Virtual function implementation and multiple inheritance

本文关键字:多重继承 实现 功能 虚拟      更新时间:2023-10-16

我有一个类F,它需要实现两个函数F()和g()。我使用两个不同的类来实现这些函数。

class Base {public: virtual void f(); virtual void g(); };
class A : public virtual Base { void f(){/***/} };
class B : public virtual Base { void g(){/***/} };

f()需要调用g(),反之亦然,使用这种设计会很好。我需要有几个A和B类的实现,比如说A1和A2,B1和B2。例如,如果我想使用A1和B2实现:

class Test : public A1, public B2 {}; 

我的问题是:如何在运行时选择实现?如果我想创建一个Test类的对象,并想根据主函数中的参数选择A和B类,我该怎么做?

不要使用继承,而是在构造函数中传递要委托的对象:

class Test : public Base
{
  Base *impl;
  public:
    Test( Base *impl ) : impl( impl ) { }
    virtual void f() { impl->f(); }
    virtual void g() { impl->g(); }
    // assignment operator, copy ctor etc.
};

main函数中,您可以执行

int main() {
   // ...
   Test *t;
   if ( someCondition ) {
     t = new Test( new A() );
   } else {
     t = new Test( new B() );
   }
   t->f();
   t->g();
}

对于虚拟类,唯一可行的选择是定义所有可能的排列,如:

class TestA1B1 : public A1, public B1 {}; 
class TestA1B2 : public A1, public B2 {}; 
...

并具有类似的织物功能

Base* create(int p1, int p2) {
  if( p1 == 1 && p2 == 1 )
    return TestA1B1();
  else if( p1 == 1 && p2 == 2 )
    return TestA1B2();
  ...
  return nullptr; 
}

但我会考虑自由函数集而不是

void f_a1(Base* ptr);
void g_b1(Base* ptr);

并将指向它们的指针存储在Base中。