2009-09-21 103 views
1

以下內容有效嗎?或者我怎麼能夠接近這個。重新定義派生類的變量

template<class T_> class Template { 
    //something 
}; 

class Parent { 
public: 
    Template<Parent> variable; 

    Parent() : variable(this) { } 
}; 

class Derived : public Parent { 
public: 
    Template<Derived> variable; 

    Derived() : Parent() { } 
} 

在此先感謝。

回答

6

這在技術上是「有效的」,在你的編譯器必須接受它(它可能警告你,恕我直言應該),但它不會做你認爲它的作用:Derived的variable是分開Parent's,並且不是得到顯式初始化(​​因此它使用Template<>的默認ctor)。

1

如果你想在基類和派生類中有一個相同名字的變量,你不需要模板。

只需定義它們並從派生訪問 - >變量和 - > Base ::變量。這些是兩個不同的變量。

+0

因此,基地調用變量將獲得它自己的版本。 – 2009-09-21 16:32:49

1

很少有小類型。
但主要問題是,父母在模板上使用了一個不存在的構造函數。

template<class T> 
class Template 
{ 
    public: 
     Template()  {} // Used in Derived 
     Template(T* t) {} // Used in Parent 
}; 

class Parent 
{ 
    public: 
     Template<Parent> variable; 

     Parent() : variable(this) {} 
}; 

class Derived : public Parent 
{ 
    public: 
     Template<Derived> variable; 

     Derived() : Parent()   {} 
}; 

我很好奇你在努力達到什麼目的。
這是「好奇復發模板」模式的一些變化或什麼?

+0

這與我的活動系統類似。模板= EventChain。事件聲明應該是void處理程序(T_&caller,.....)。父觸發器變量(ClickEvent)事件。所以通過某種方式聲明Derived類中的ClickEvent我希望允許用戶定義處理程序(Derived&)而不是處理程序(Parent&)。 – 2009-09-21 16:51:08

1

你不應該得到的東西接近這個,因爲一個公共變量的這種重新定義違反Liskov Substitution Principle - 你Derived變得比Parent更嚴格,且不能在它的位置被取代,因此它不應該是一個超類/子類關係。

此外,如果將允許你重新定義的實際重複使用相同的內存位置總得意義上的場,那麼它會打破類型系統,以及:在Parent所有方法期望variableTemplate<Parent>型;如果它實際上是Template<Derived>的實例,則不能保證Template<T>T中是協變的。