建構函式不能聲明為虛函數的原因是:

來源:互聯網
上載者:User

解釋一:所謂虛函數就是多態情況下只執行一個,而從繼承的概念來講,總是要先構造父類對象,然後才能是子類對象,如果建構函式設為虛函數,那麼當你在構造父類的建構函式時就不得不顯示的調用構造,還有一個原因就是為了防錯,試想如果你在子類中一不小心重寫了個跟父類建構函式一樣的函數,那麼你的父類的建構函式將被覆蓋,也即不能完成父類的構造.就會出錯.
  解釋二:虛函數的主要意義在於被衍生類別繼承從而產生多態. 衍生類別的建構函式中, 編譯器會加入構造基類的代碼, 如果基類的建構函式用到參數, 則衍生類別在其建構函式的初始化列表中必須為基類給出參數, 就是這個原因.
  解構函式設為虛函數的作用:
  解釋:在類的繼承中,如果有基類指標指向衍生類別,那麼用基類指標delete時,如果不定義成虛函數,衍生類別中派生的那部分無法析構。
  例:
  #include "stdafx.h"
  #include "stdio.h"
  class A
  {
  public:
  A();
  virtual ~A();
  };
  A::A()
  {
  }
  A::~A()
  {
  printf("Delete class AP\n");
  }
  class B : public A
  {
  public:
  B();
  ~B();
  };
  B::B()
  {
  }
  B::~B()
  {
  printf("Delete class BP\n");
  }
  int main(int argc, char* argv[])
  {
  A *b=new B;
  delete b;
  return 0;
  }
  輸出結果為:Delete class B
  Delete class A
  如果把A 的virtual 去掉:
  那就變成了Delete class A
  因此解構函式不聲明為虛函數容易造成記憶體流失

 

COPY另一位大牛:

最近有人問建構函式能不能是虛函數:

當然不能

解釋一下:

1,從儲存空間角度

虛函數對應一個vtable,這大家都知道,可是這個vtable其實是儲存在對象的記憶體空間的。問題出來了,如果建構函式是虛的,就需要通過 vtable來調用,可是對象還沒有執行個體化,也就是記憶體空間還沒有,怎麼找vtable呢?所以建構函式不能是虛函數。

2,從使用角度

虛函數主要用於在資訊不全的情況下,能使重載的函數得到對應的調用。建構函式本身就是要初始化執行個體,那使用虛函數也沒有實際意義呀。所以建構函式沒有必要是虛函數。


=:

虛函數的作用在於通過父類的指標或者引用來調用它的時候能夠變成調用子類的那個成員函數。而建構函式是在建立對象時自動調用的,不可能通過父類的指標或者引用去調用,因此也就規定建構函式不能是虛函數。




三.

建構函式不需要是虛函數,也不允許是虛函數,因為建立一個對象時我們總是要明確指定對象的類型,儘管我們可能通過實驗室的基類的指標或引用去訪問它


但析構卻不一定,我們往往通過基類的指標來銷毀對象。這時候如果解構函式不是虛函數,就不能正確識別物件類型從而不能正確調用解構函式。

四:

從實現上看,vbtl在建構函式調用後才建立,因而建構函式不可能成為虛函數

從實際含義上看,在調用建構函式時還不能確定對象的真實類型(因為子類會調父類的建構函式);而且建構函式的作用是提供初始化,在對象生命期只執行一次,不是對象的動態行為,也沒有太大的必要成為虛函數

五:

當一個建構函式被調用時,它做的首要的事情之一是初始化它的V P T R。因此,它只能知道它是“當前”類的,而完全忽視這個對象後面是否還有繼承者。 當編譯器為這個建構函式產生代碼時,它是為這個類的建構函式產生代碼- -既不是為基類,也不是為它的衍生類別(因為類不知道誰繼承它)。

所以它使用的V P T R必須是對於這個類的V TA B L E。而且,只要它是最後的建構函式調用,那麼在這個對象的生命期內, V P T R將 保持被初始化為指向這個V TA B L E。但如果接著還有一個更晚派生的建構函式被調用,這個建構函式又將設定V P T R指向它的 V TA B L E,等.直到最後的建構函式結束。V P T R的狀態是由被最後調用的建構函式確定的。這就是為什麼建構函式調用是從基類到更加派生 類順序的另一個理由。

但是,當這一系列建構函式調用正發生時,每個建構函式都已經設定V P T R指向它自己的 V TA B L E。如果函數調用使用虛機制,它將只產生通過它自己的V TA B L E的調用,而不是最後的V TA B L E(所有建構函式被 調用後才會有最後的V TA B L E)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.