我有一个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类,我该怎么做?
答案 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中存储指向它们的指针。