C++虛函數 - 靜態函數能否為虛函數 .


1.virtual與靜態函數

C++中,靜態成員函數不能被聲明為virtual函數。
例如,下面的程序會編譯失敗。
#include<iostream>
class Test
{
   public:
      // 編譯錯誤:static成員函數不能聲明為virtual   
      virtual static void fun()  { }
};

同樣地,靜態成員函數也不能被聲明為const和volatile.
下面的程序也會編譯失敗。
#include<iostream>
class Test
{
   public:
      // 編譯錯誤: static成員函數不能為const
      static void fun() const { }

      // 如果聲明為下面這樣,是可以的。
      const static void fun() {}
      或類似於
      const static int fun() { return 0; }
};

2.為何static成員函數不能為virtual

1. static成員不屬於任何類對象或類實例,所以即使給此函數加上virutal也是沒有任何意義的。
2. 靜態與非靜態成員函數之間有一個主要的區別。那就是靜態成員函數沒有this指針。
   
   虛函數依靠vptr和vtable來處理。vptr是一個指針,在類的構造函數中創建生成,並且只能用this指針來訪問它,因為它是類的一個成員,並且vptr指向保存虛函數地址的vtable.
   對於靜態成員函數,它沒有this指針,所以無法訪問vptr. 這就是為何static函數不能為virtual.
   虛函數的調用關系:this -> vptr -> vtable ->virtual function

通過下面例子可以確定,當類增加了一個虛函數后,類的大小會增大4字節(指針的大小).
class Test
{
public:
      int _m;
};
sizeof(Test) = 4;

加入虛函數后,
class Test
{
public:
      int _m;
      virtual void fun();
};
sizeof(Test) = 8
 

3.為何static成員函數不能為const函數

當聲明一個非靜態成員函數為const時,對this指針會有影響。對於一個Test類中的const修飾的成員函數,this指針相當於Test const *, 而對於非const成員函數,this指針相當於Test *.
  而static成員函數沒有this指針,所以使用const來修飾static成員函數沒有任何意義。
  volatile的道理也是如此。
public:
      int _m;
      virtual void fun();
};
sizeof(Test) = 8
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM