我有2个类,其中的功能是复制和粘贴。这些类之间的唯一区别是每个继承的类。这些超类具有相同的调用签名,但构造函数不同。
我试图做类似的事情:
template<class BaseClass>
class IGenericPart : public BaseClass {
public:
int commonCall1() { return 10; }
int commonCall2() { return 44; }
};
class A : public IGenericPart<RealBaseClass1> {
public:
A(int x) : IGenericPart<RealBaseClass1> (x, b) {}
};
class B : public IGenericPart<RealBaseClass2> {
public:
B(string z) : IGenericPart<RealBaseClass2> (z, anothertype2, anothertype2) {}
};
但我不知道如何使IGenericPart
类具有基于泛型BaseClass
的正向构造函数。
所以基本上,我需要IGenericPart<RealBaseClass1>
和IGenericPart<RealBaseClass2>
具有不同的构造函数。
答案 0 :(得分:1)
您只是错过了using
声明。
当类IGenericPart<>
继承自BaseClass
时,它不会自动从BaseClass
继承构造函数。要继承构造函数,必须使用using
声明显式地执行此操作,如下所示:
template<class BaseClass>
class IGenericPart : public BaseClass {
public:
using BaseClass::BaseClass;
// etc ...
};
然后,这会为IGenericPart<BaseClass>
创建与BaseClass
的每个构造函数对应的构造函数,因此A
和B
的初始化列表将作为预期
请注意,构造函数inheritence是一个C ++ 11特性,因此您必须使用支持C ++ 11的编译器在C ++ 11模式下进行编译才能实现此功能。
答案 1 :(得分:1)
如果由于某种原因无法使用c ++ 11,可以通过将以下笨重的位添加到通用部分来使其工作:
template<class BaseClass>
class IGenericPart: public BaseClass {
public:
template <typename A>
IGenericPart(A a) : BaseClass(a) {}
template <typename A, typename B>
IGenericPart(A a, B b) : BaseClass(a, b) {}
template <typename A, typename B, typename C>
IGenericPart(A a, B b, C c) : BaseClass(a, b, c) {}
}