我们使用第三方库来控制专用PCI卡。供应商发布了一个新的卡,它使用一个新的类来控制它,但是新的类与旧的类有相同的方法。
我想这是一个
混合
但我不确定。下面的代码显示了这种情况。
在template类中重新定义每个方法是可能的,但是在template类中有很多方法
APIClass1
和
APIClass2
. (方法具有相同的名称和签名)。我的意思是:
void one() { TBase::one(); }
C++中有没有一种方法可以复制很多代码呢?
#include <stdio.h>
class APIClass1
{
public:
void one() { printf("APIClass1 ONE\n"); }
void two() { printf("APIClass1 TWO\n"); }
};
class APIClass2
{
public:
void one() { printf("APIClass2 ONE\n"); }
void two() { printf("APIClass2 TWO\n"); }
};
class MasterClassBC
{ };
template <class T>
class MasterClass : public T, public MasterClassBC
{
public:
typedef T TBase;
};
int main(int argc, char *argv[])
{
// Use pointer to base class object
MasterClassBC *pBc;
if (isNewCard())
pBc = new MasterClass<APIClass2>;
else
pBc = new MasterClass<APIClass1>;
pBc->two(); // error:âclass MasterClassBCâ has no member named âtwoâ
}
编辑I
顶端类1
和
顶端类2
.
在下面的例子中,我们有
void three()
和
void three(int n)
.
我试着创造
newThree()
它在运行时调用相应的函数,但由于TBase缺少一个或另一个函数,因此它不会编译
three
方法取决于它的专业化程度。
class APIClass1
{
public:
void one() { printf("APIClass1 ONE\n"); }
void two() { printf("APIClass1 TWO\n"); }
void three() { printf("APIClass1 THREE\n"); }
};
class APIClass2
{
public:
void one() { printf("APIClass2 ONE\n"); }
void two() { printf("APIClass2 TWO\n"); }
void three(int n) { printf("APIClass2 THREE: %d\n", n); }
};
class MasterClassBC
{
virtual void one() = 0;
virtual void two() = 0;
virtual void newThree() = 0
};
template <class T>
class MasterClass : public T, public MasterClassBC
{
public:
typedef T TBase;
MasterClass(bool useApi1 = true) : mUseApi1(useApi1) {}
void setTheNumber(int n) { mTheNumber = n; }
void one() { TBase::one(); }
void two() { TBase::two(); }
void newThree()
{
if (mUseApi1)
TBase::three();
else
TBase::three(mTheNumber);
}
private:
bool mUseApi1;
int mTheNumber;
};