歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

C++ 虛函數與純虛函數

今天講講C++中,虛函數與純虛函數的用法和區別。

虛函數的提出在我上一篇關於C++的文章中已經提過(見http://www.linuxidc.com/Linux/2013-04/83407.htm),是為了解決多繼承的二義性而提出的,今天不再贅述;

而純虛函數是一種特殊的函數,它的作用是在基類中不給出有意義的實現,而把說明成純虛函數,它的實現留給該基類的派生類去做。包含純虛函數的類就是抽象類,抽象類不能被實例化,但是可以定義指向抽象類數據的指針變量,當派生類稱為具體類後,就可以用這種指針指向派生類的對象,然後通過該指針調用虛函數,實現多態操作。

虛函數和純虛函數的書寫格式類似於下面:

  class Student

  {

      virtual char * test();    //虛函數

      virtual char * Category() =0;  //純虛函數

  };

虛函數可以被直接調用,也可以備子類重載以後以多態的形式調用,而純虛函數必須在子類中實現該函數才可以使用,因為純虛函數在基類只有聲明而沒有定義。

虛函數和純虛函數的定義中不能有static 標識符,原因很簡單,被static修飾的函數在編譯時候要求前期綁定,然而虛函數確實動態綁定,而且被兩者修飾的函數生命周期也不一樣。

如果一個類中含有純虛函數,那麼任何試圖對該類進行實例化的語句都將導致錯誤的產生,因為抽象基類不能被直接調用,必須呗子類集成重載以後,根據要求調用其子類的方法。

class StudentA
  {
public:
    virtual void funOne() = 0;  // 說明fun函數為純虛函數
    virtual void funTwo();
};

class StudentB
{
public:
  virtual void funOne();
  virtual void funTwo();
};

// CA,CB類的實現
...

void main()
{
    StudentA xiaoliu;  // 不允許,因為類CA中有純虛函數
    StudentB xiaoxin;  // 可以,因為類CB中沒有純虛函數
    ...
}

本文簡要介紹了虛函數和純虛函數,並對它們做了簡要區分。簡單來說,虛函數是為了多重繼承的二義性問題而提出的解決方案,純虛函數的提出是使一些類的實例化更加符合邏輯,便於實現多態。

Copyright © Linux教程網 All Rights Reserved