2012-01-10 84 views
52

假設我們有一個模板類Area,它具有成員變量T areaT getArea()void setArea(T)成員函數。繼承自C++中的模板類

我可以通過鍵入Area<int>來創建特定類型的Area對象。

現在我有一個類Rectangle繼承Area類。由於Rectangle本身不是模板,因此我無法輸入Rectangle<int>

如何專門爲Rectangle對象繼承Area類型?

編輯:對不起,我忘了澄清 - 我的問題是是否有可能繼承區域沒有專門化,所以它不是繼承爲區域的整數,但區域矩形可以專門化的類型。

+1

它是_class template_,因爲它是從中生成類的模板。 – sbi 2012-01-10 20:48:47

回答

138

對於理解模板,它的巨大優勢獲得術語直,因爲你談論t時的方式下襬決定了思考他們的方式。

具體而言,Area不是模板類,而是類模板。也就是說,它是可以從中生成類的模板。 Area<int>是這樣一個類(它的不是的一個對象,但是當然,您可以用與創建任何其他類的對象相同的方式創建該類的對象)。另一個這樣的類將是Area<char>。請注意,這些是完全不同的類,除了它們是從同一個類模板生成的事實外,它們沒有什麼共同之處。

由於Area不是一個類,所以不能從中派生類Rectangle。你只能從另一個類(或其中的幾個)中派生出一個類。由於Area<int>是一類,你可以,例如,從中獲得Rectangle

class Rectangle: 
    public Area<int> 
{ 
    // ... 
}; 

由於Area<int>Area<char>屬於不同類別,你甚至可以從兩個在同一時間(訪問它們的成員然而,當得出,你將不得不面對歧義):

class Rectangle: 
    public Area<int>, 
    public Area<char> 
{ 
    // ... 
}; 

但是你必須指定其歸從,當你定義Rectangle派生。無論這些類是否是從模板生成的,都是如此。相同類的兩個對象根本不能有不同的繼承層次結構。

你可以做的是製作Rectangle模板。如果你寫

template<typename T> class Rectangle: 
    public Area<T> 
{ 
    // ... 
}; 

您有一個模板Rectangle從中可以得到一個類Rectangle<int>Area<int>派生,而不同的類Rectangle<char>Area<char>派生。

它可能是你想要一個單一的類型Rectangle,以便您可以將各種各樣的Rectangle傳遞給相同的功能(本身不需要知道面積類型)。由於通過實例化模板Rectangle生成的Rectangle<T>類在形式上相互獨立,因此它不會以這種方式工作。但是你可以利用多重繼承在這裏:

class Rectangle // not inheriting from any Area type 
{ 
    // Area independent interface 
}; 

template<typename T> class SpecificRectangle: 
    public Rectangle, 
    public Area<T> 
{ 
    // Area dependent stuff 
}; 

void foo(Rectangle&); // A function which works with generic rectangles 

int main() 
{ 
    SpecificRectangle<int> intrect; 
    foo(intrect); 

    SpecificRectangle<char> charrect; 
    foo(charrect); 
} 

如果重要的是,你的通用Rectangle是從一個普通的Area派生你可以做同樣的伎倆與Area太:

class Area 
{ 
    // generic Area interface 
}; 

class Rectangle: 
    public virtual Area // virtual because of "diamond inheritance" 
{ 
    // generic rectangle interface 
}; 

template<typename T> class SpecificArea: 
    public virtual Area 
{ 
    // specific implementation of Area for type T 
}; 

template<typename T> class SpecificRectangle: 
    public Rectangle, // maybe this should be virtual as well, in case the hierarchy is extended later 
    public SpecificArea<T> // no virtual inheritance needed here 
{ 
    // specific implementation of Rectangle for type T 
}; 
4

Rectangle將必須是一個模板,否則它是只是一種類型。它不可能是一個非模板,而它的基礎是神奇的。 (其基礎可能是一個模板實例,但你似乎想維持基本的功能作爲模板

7
class Rectangle : public Area<int> { 
}; 
10

你只是想從Area<int>派生?在這種情況下,你這樣做:

class Rectangle : public Area<int> 
{ 
    // ... 
}; 

編輯:繼澄清,看來你實際上是試圖使Rectangle模板,以及,在這種情況下,下面應該工作:

template <typename T> 
class Rectangle : public Area<T> 
{ 
    // ... 
}; 
5

使矩形模板,通過類型名稱上區:

template <typename T> 
class Rectangle : public Area<T> 
{ 

}; 
0
#include<iostream> 

using namespace std; 

template<class t> 
class base { 
protected: 
    t a; 
public: 
    base(t aa){ 
     a = aa; 
     cout<<"base "<<a<<endl; 
    } 
}; 

template <class t> 
class derived: public base<t>{ 
    public: 
     derived(t a): base<t>(a) { 
     } 
     //Here is the method in derived class 
    void sampleMethod() { 
     cout<<"In sample Method"<<endl; 
    } 
}; 

int main() { 
    derived<int> q(1); 
    // calling the methods 
    q.sampleMethod(); 
} 
+0

如果派生類中有方法,該怎麼辦?你會如何定義它們?至少對於我來說,大部分都是導入的,你怎麼在main()函數中調用/使用這些方法? – Pototo 2017-06-02 22:44:12

+0

您的問題的答案是在代碼 – 2017-06-03 06:00:35

+2

首先,這是一個非常古老的問題,已經有一個很好的答案。其次,請避免只有代碼的答案(和問題)。包含詳細解釋也很有用。 – marcman 2017-07-08 20:02:33