示例**
class
base
virtual
void
func()
;};class
derive
virtual
void
func()
;private
:int data;};
intmain()
執行結果
1. 程式輸出: 1 。執行了base中的func(), 而沒有執行derive中的func()。按理來說,乙個基類
的指標指向派生類,執行時動態繫結後應該執行的是derive中的func可是卻執行的是base中的func(),
這是為什麼呢?
產生的這個結果的原因
1. 構造上: 在例項化乙個派生類時,先執行的基類的建構函式,最後再執行派生類的建構函式。在
構造基類物件時,派生類的資料成員都沒有被初始化,此時呼叫派生類的virtual
func
()將會對乙個
未被初始化的位址進行解引用,導致訪問非方法記憶體,而出錯。所以此時只能執行基類的virtual func;
2. 總結:
①、派生類物件尚未被初始化,呼叫派生類版本的func
()會導致訪問非法記憶體
②、當在構造基類部分時,派生類還沒被完全建立,從某種意義上講此時它只是個基類物件。
錯誤
如果能生成可執行檔案,執行時一定出錯。
· 析構函式的呼叫跟建構函式的呼叫順序是相反的,它從最派生類的析構函式開始的。也就是說當基類
的析構函式執行時,派生類的析構函式已經執行過,派生類中的成員資料被認為已經無效。假設基類
中虛函式呼叫能呼叫得到派生類的虛函式,那麼派生類的虛函式將訪問一些已經「無效」的資料,所
帶來的問題和訪問一些未初始化的資料一樣
1. 基類部分在派生類部分之前被構造,當基類建構函式執行時派生類中的資料成員還沒被初始化。如
果基類建構函式中的虛函式呼叫被解析成呼叫派生類的虛函式,而派生類的虛函式中又訪問到未初始化
的派生類資料,將導致程式出現一些未定義行為和bug。
2. 析構函式的呼叫跟建構函式的呼叫順序是相反的,它從最派生類的析構函式開始的。也就是說當基
類的析構函式執行時,派生類的析構函式已經執行過,派生類中的成員資料被認為已經無效。
建構函式,析構函式能否宣告為虛函式
建構函式不能宣告為虛函式 析構函式可以宣告為虛函式,而且有時是必須宣告為虛函式 不建議在建構函式和析構函式裡面呼叫虛函式。建構函式不能宣告為虛函式的原因是 1 構造乙個物件的時候,必須知道物件的實際型別,而虛函式行為是在執行期間確定實際型別的。而在構造乙個物件時,由於物件還未構造成功。編譯器無法知道...
建構函式和析構函式能否宣告為虛函式?
建構函式不能宣告為虛函式,析構函式可以宣告為虛函式,而且有時是必須宣告為虛函式。不建議在建構函式和析構函式裡面呼叫虛函式。建構函式不能宣告為虛函式的原因是 解釋一 所謂虛函式就是多型情況下只執行乙個。而從繼承的概念來講,總是要先構造父類物件,然後才能是子類物件。如果建構函式設為虛函式,那麼當你在構造...
建構函式和析構函式能否宣告為虛函式?
建構函式不能宣告為虛函式,析構函式可以宣告為虛函式,而且有時是必須宣告為虛函式。不建議在建構函式和析構函式裡面呼叫虛函式。建構函式不能宣告為虛函式的原因是 解釋一 所謂虛函式就是多型情況下只執行乙個。而從繼承的概念來講,總是要先構造父類物件,然後才能是子類物件。如果建構函式設為虛函式,那麼當你 在構...