1. 程式人生 > >模板類中可以使用虛擬函式嗎?模板成員函式可以是虛擬函式嗎?

模板類中可以使用虛擬函式嗎?模板成員函式可以是虛擬函式嗎?

內容轉載自csdn論壇。

1,模板類中可以使用虛擬函式。

完全一樣,
在非模板類裡怎麼用虛擬函式,
就在模板類裡怎麼用

template class<T>
class A
{
public:
  virtual void f1(){cout<<"A is called"<<endl;}  //虛擬函式
  virtual void f2()=0{cout<<"A=0"<<endl;}  //純虛擬函式
};

template class<T>
class B: public A<T>
{
public:
  void f1(){cout<<"B is called"<<endl;}


  void f2(){cout<<"B!=0"<<endl;}
};

void main()
{
A<int>* p=new B<int>;
p->f1();                   //輸出B is called,虛擬函式成功
}

唯一需要注意的是:
A<int>和A<char>是兩個完全不同的類。

上邊程式碼不能是A<int>* p = new B<char>;

因為A<int> 不是B<char>的基類。

所以得出結論:模板是不影響類的多型的。

2,模板成員函式不可以是虛擬函式。

解釋1:

編譯器都期望在處理類的定義的時候就能確定這個類的虛擬函式表的大小,如果允許有類的虛成員模板函式,那麼就必須要求編譯器提前知道程式中所有對該類的該虛成員模板函式的呼叫,而這是不可行的。 

解釋2:

在例項化模板類時,需要建立vertual table。
在模板類被例項化完成之前不能確定函式模板(包括虛擬函式模板,加入支援的話)會被例項化多少個。
普通成員函式模板無所謂,什麼時候需要什麼時候就給你例項化,編譯器不用知道到底需要例項化多少個,虛擬函式的個數必須知道,否則這個類就無法被例項化(因為要建立virtual table)。因此,目前不支援虛擬函式模板。