2012-09-19 50 views
4

为了避免多重和虚拟继承,我选择了使用模板继承。我的目标是让不同的孩子(4或5代或我不控制的继承)有一个共同的函数调用,而不管它们派生什么。使用模板继承调用祖父母构造函数

我的解决办法是插入模板继承像这样:

template <typename BASE> 
class common_call : public BASE { 
public: 
    void foo() { /*implementation independent of base*/ } 
}; 

class child1 : public common_call <base1> {}; 
class child2 : public common_call <base2> {}; 

这有调用基地的构造函数的问题。类base1和base2(不是我写的)具有不同的构造函数,我必须在初始化列表中调用它。 common_call模板对这些构造函数一无所知,但是这些子类正如他们当前直接继承一样。

有没有办法为我做到这一点:

class child3 : public common_call<base3>{ 
public: 
    child3(param1, param2) : base3(param2) {/*do things here*/} 
}; 

我试图避免局部模板专门为每种类型的基础,如果可能的。

+1

你使用的是C++ 11吗?在这种情况下,您可以使用可变参数模板和完美的转发来将构造函数添加到'common_call',它只是将所有参数传递给当前基类。 – Grizzly

+0

如果实现与基类无关,那么为什么不单纯地从'base'和'common_call'分别继承? – Puppy

+0

我忘了提及的一些东西:函数foo()不取决于BASE的类型,只要它来自一个共同的祖先ANCESTOR(base1,base2和base3所做的)。另一方面,子类必须从base1等派生,所以我试图避免两次继承ANCESTOR。 不幸的是,我的环境还不允许C++ 11。如果有的话,我的很多问题都会消失。 – Filipp

回答

2

如果你给common_call使用可变参数模板这样的模板构造函数:

template <typename BASE> 
class common_call : public BASE 
{ 
public: 
    // C++11 variadic templates to define whole range of constructors 
    template<typename... Args> 
    common_call(Args&&... args) 
    : 
     BASE(std::forward<Args>(args)...) 
    {} 

    void foo() { /*implementation independent of base*/ } 
}; 

那么你可以从common_call得出与任何模板参数(例如,base3),并调用该类已定义的所有构造函数

class child3 
: 
    public common_call<base3> 
{ 
public: 
    child3(Type1 param1, Type2 param2) 
    : 
     common_call(param2), // call constructor overload with 1 parameter of Type2 
     t1_(param1)   // initialize t1_ member 
    {} 

private: 
    Type1 t1_; 
};