2016-09-26 106 views
1

假設我們有下面的示例類:C++:從模板類繼承與可能的不同構造函數參數

class A { 
    public: 
    explicit A(int foo) { } 

    void test() { 
     cout << "I'm in A" << endl; 
    } 
}; 

class B { 
    public: 
    explicit B(string bar) { } 

    void test() { 
     cout << "I'm in B" << endl; 
    } 
}; 

我想定義一個子類從模板化類 可以專門爲一個繼承的A或B.我面臨的問題是A 和B有不同的構造函數參數,所以構建Child的構造函數是 證明有點令人煩惱。

template <class ParentClass> 
class Child : public ParentClass { 
    public: 
    Child<B>() : ParentClass("foo") { 
    } 
}; 

int main() { 
    Child<B> c; 
    c.test(); 
    return 0; 
} 

不過,我希望也能像做Child<A> c:如果我這樣做下面的事情工作。這可能是 嗎?

謝謝!

+0

你想要一個'Child'的默認構造函數嗎? – skypjack

回答

5

您可以專門爲每個類:

template <class ParentClass> 
class Child : public ParentClass { 
    public: 
    Child(); 
}; 

template <> 
Child<A>::Child() : A(42) {} 

template <> 
Child<B>::Child() : B("42") {} 

Demo

3

你可以嘗試用模板的構造函數如下:

#include <iostream> 

using namespace std; 

class A { 
public: 
    explicit A(int foo) { } 

    void test() { 
     cout << "I'm in A" << endl; 
    } 
}; 

class B { 
public: 
    explicit B(string bar) { } 

    void test() { 
     cout << "I'm in B" << endl; 
    } 
}; 

template <class Parent> 
class Child 
: public Parent { 

public: 
    template <class... Args> 
    Child(Args... args) 
    : Parent(args...) { 

    } 
}; 

int main() { 
    Child<A> a_child(42); 
    Child<B> b_child("42"); 
    a_child.test(); 
    b_child.test(); 
} 
1

您可以使用委託構造函數,如果你不想讓用戶決定參數:

template <class ParentClass> 
class Child : public ParentClass { 
public: 
    using ParentClass::ParentClass; 
};