您好,登錄后才能下訂單哦!
本篇內容主要講解“C++中為什么不要模板化類繼承”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C++中為什么不要模板化類繼承”吧!
T.80:不要天真地模板化類繼承
Templating a class hierarchy that has many functions, especially many virtual functions, can lead to code bloat.
模板化包含很多成員函數,特別是虛函數的類繼承層次會導致代碼膨脹。
Example, bad(反面示例)
template<typename T>
struct Container { // an interface
virtual T* get(int i);
virtual T* first();
virtual T* next();
virtual void sort();
};
template<typename T>
class Vector : public Container<T> {
public:
// ...
};
Vector<int> vi;
Vector<string> vs;
It is probably a bad idea to define a sort as a member function of a container, but it is not unheard of and it makes a good example of what not to do.
為容器定義一個排序成員函數幾乎肯定就是一個壞主意,但這并非沒有先例,可以當作說明我們不應該做什么的好例子。
Given this, the compiler cannot know if vector<int>::sort() is called, so it must generate code for it. Similar for vector<string>::sort(). Unless those two functions are called that's code bloat. Imagine what this would do to a class hierarchy with dozens of member functions and dozens of derived classes with many instantiations.
編輯器接受這段代碼時,無法知道vector<int>::sort()是否被調用了,因此必須為之生成代碼。vector<string>::sort()的情況也一樣。只要這兩個函數沒有被調用,這就是一種代碼膨脹。想象一下:這種情況如果發生在一個包含數十個成員函數和被多次例示的數十個派生類的繼承結構時會發生什么。
Note(注意)
In many cases you can provide a stable interface by not parameterizing a base; see "stable base" and OO and GP
在很多情況下,你可以在不必參數化基類的情況下提供穩定的接口;參見“穩定的基類和OO and GP。
Enforcement(實施建議)
標記依賴模板參數的虛函數。
到此,相信大家對“C++中為什么不要模板化類繼承”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。