虚函数实现和多重继承

时间:2015-06-26 13:38:49

标签: c++ polymorphism multiple-inheritance virtual-functions

我有一个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类对象,并希望根据main函数中的参数选择A和B类,我该怎么做?

2 个答案:

答案 0 :(得分:2)

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

ser.write(("%s\r\n"%command).encode('ascii'))

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

答案 1 :(得分:1)

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

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中存储指向它们的指针。