2009-10-27 48 views

回答

1

您既不會繼承「經典」構造函數,也不會繼承「命名」構造函數。您應該爲每個派生類創建特定的構造函數。

下面是一個例子,如何命名的構造函數可以繼承使用:

class SpiralPoint: public Point{ 
    private: SpiralPoint(float t, float r) 
    :Point(Point::polar(r*t, t)) { }; 
}; 
3
struct Foo { 
    template<typename T> static T one() { return T(1); } 
}; 

struct A { int x; A(int i) : x(i) {}}; 
struct B : A { B(int i) : A(i) {}}; 

,它允許你做這樣的事情

A a = Foo::one<A>(); 
B b = Foo::one<B>(); 
+0

的改進: 結構A {模板靜態t的一(){返回T(1); } – 2009-10-28 22:21:17

+0

好點,編輯包含您的建議 – ezpz 2009-10-29 00:41:37

1

命名的構造函數是一個成語,它們是不是真實的構造函數。嚴格地說,命名視圖取決於static函數。繼承需要virtual函數。現在,非成員不能是虛擬的,因此排除了具有static virtual功能的想法。

問題:我可以使用C++ 0x「using」來減少樣板代碼的數量嗎?

using聲明要求編譯器繼承基類構建函數的全或無。所以,是的,他們可以簡化你的代碼。但是,你所有的編譯器都支持C++ 0x嗎?

0

我發現(幾乎)完美的解決方案!

template <class T> 
class Color { 

public: 

    static T Red () { return T (0); } 
    static T Green() { return T (1); } 
    static T Blue () { return T (2); } 

protected: 

    explicit Color (int raw) : raw (raw) { 
    } 

private: 

    int raw; 

}; 

class MoreColor : public Color <MoreColor> { 

public: 

    static MoreColor Octarina() { return MoreColor(8); } 

private: 

    friend class Color <MoreColor>; 
    explicit MoreColor (int raw) : Color <MoreColor> (raw) {} 
}; 

void Test() { 
    MoreColor o = MoreColor::Octarina(); 
    MoreColor r = MoreColor::Red(); 
} 

並將其編譯:d