模板類的繼承問題

2021-07-11 09:03:53 字數 2404 閱讀 3456

class a 

void fun()

};class b

void fun()

};class c

void fun()

};templateclass test

void show()

};int main(int argc,char**argv)

我們先來大概分析一下這段沒有實際意義的**:

首先定義了類a,類b,類c,這三個類都具有show方法和fun方法,只不過具體的實現不同。接著又定義了模板類test。

下來我們看程式的執行結果:

上面的**我們並沒有使用繼承,通過模板類test的型別,使得函式的呼叫不同。。。

下面我們來看如何通過繼承來實現:

class a 

void fun()

};class b

void fun()

};class c

void fun()

};templateclass test

void show()

};templateclass derived: public test

#endif

//第二種方式

#if 0

void fun()

#endif

//第三種方式

#if 1

void fun()

#endif

};int main(int argc,char**argv)

如果我們把上述derived類中的fun函式改寫成如下的形式:

void fun()

那麼這段**編譯器是無法通過編譯的。編譯器則抱怨show方法和send方法不存在。但是我們明明在基類test中定義了,編譯器卻看不到它們,這是為什麼呢?

這個問題在於,當編譯器遭遇class template derived定義式時,並不知道它繼承什麼樣的class。當然它繼承的是test,但其中com是個template引數,不到後來(當derived被具體化)無法確切知道它是什麼。而如果不知道com是什麼,就無法知道class test看起來像什麼-----更明確的說是沒辦法知道它是否有個send方法和show方法。。

我們可以有三種方式解決這個問題:

(1)在base class函式呼叫動作之前加上「this ->」。

(2)使用using宣告式。

(3)明確的指出被呼叫的函式位於base class內。

在上面的程式中也體現出來了。。。

下面我們給出程式的執行結果:

下來我們考慮這個問題,如果現在有個類d,它只有乙個fun方法,並沒有show的方法。這時我們需要為類d產生乙個test的特化版,具體的實現如下:

class a 

void fun()

};class b

void fun()

};class c

void fun()

};class d

};templateclass test

public:

void send()

void show()

};template<>

class test

public:

void send()

void show()

};templateclass derived: public test

#endif

//第二種方式

#if 1

void fun()

#endif

//第三種方式

#if 0

void fun()

#endif

};int main(int argc,char**argv)

注:程式中標紅的就是乙個特化版的test template,「template<>」語法象徵這既不是template也不是標準class,在template實參是d時被使用。這就是所謂的模板全特化。

我們來看程式的執行結果:

模板類在繼承時,可在derived class template內通過"this ->"指涉base class template內的成員名稱,或籍由乙個明白寫出的「base class 資格修飾符」完成。 注

模板類的繼承

模板類的繼承包括四種 1.普通類繼承模板類 cpp view plain copy template class tbase class derived public tbase 2.模板類繼承了普通類 非常常見 cpp view plain copy class tbase template cl...

模板類的繼承

模板類的繼承包括四種 1.普通類繼承模板類 cpp view plain copy template class t class tbase class derived public tbase int 2.模板類繼承了普通類 非常常見 cpp view plain copy class tbase...

模板類的繼承

模板類的繼承包括四種 1.普通類繼承模板類 cpp view plain copy template class t class tbase class derived public tbase int 2.模板類繼承了普通類 非常常見 cpp view plain copy class tbase...