为什么构造函数不能声明为虚函数,析构函数可以,构造函数中为什么不能调用虚函数?
生活随笔
收集整理的這篇文章主要介紹了
为什么构造函数不能声明为虚函数,析构函数可以,构造函数中为什么不能调用虚函数?
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
為什么構(gòu)造函數(shù)不能聲明為虛函數(shù),析構(gòu)函數(shù)可以,構(gòu)造函數(shù)中為什么不能調(diào)用虛函數(shù)
- 構(gòu)造函數(shù)中為什么不能調(diào)用虛函數(shù)?
- 第一個(gè)理由是概念上的
- 第二個(gè)理由是機(jī)械上的。
- 構(gòu)造函數(shù)不能聲明為虛函數(shù)的原因是
- 1 構(gòu)造一個(gè)對(duì)象的時(shí)候,必須知道對(duì)象的實(shí)際類型,而虛函數(shù)行為是在運(yùn)行期間確定實(shí)際類型的。
- 2 虛函數(shù)的執(zhí)行依賴于虛函數(shù)表。而虛函數(shù)表在構(gòu)造函數(shù)中進(jìn)行初始化工作,即初始化vptr,讓他指向正確的虛函數(shù)表。
- 注意點(diǎn)
構(gòu)造函數(shù)中為什么不能調(diào)用虛函數(shù)?
構(gòu)造函數(shù)調(diào)用層次會(huì)導(dǎo)致一個(gè)有趣的兩難選擇。試想:如果我們?cè)跇?gòu)造函數(shù)中并且調(diào)用了虛函數(shù),那么會(huì)發(fā)生什么現(xiàn)象呢?在普通的成員函數(shù)中,我們可以想象所發(fā)生的情況——虛函數(shù)的調(diào)用是在運(yùn)行時(shí)決定的。這是因?yàn)榫幾g時(shí)這個(gè)對(duì)象并不能知道它是屬于這個(gè)成員函數(shù)所在的那個(gè)類,還是屬于由它派生出來(lái)的某個(gè)類。于是,我們也許會(huì)認(rèn)為在構(gòu)造函數(shù)中也會(huì)發(fā)生同樣的事情。
然而,情況并非如此。對(duì)于在構(gòu)造函數(shù)中調(diào)用一個(gè)虛函數(shù)的情況,被調(diào)用的只是這個(gè)函數(shù)的本地版本。也就是說(shuō),虛機(jī)制在構(gòu)造函數(shù)中不工作。
第一個(gè)理由是概念上的
在概念上,構(gòu)造函數(shù)的工作是生成一個(gè)對(duì)象。在任何構(gòu)造函數(shù)中,可能只是部分形成對(duì)
總結(jié)
以上是生活随笔為你收集整理的为什么构造函数不能声明为虚函数,析构函数可以,构造函数中为什么不能调用虚函数?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 怎么用大白菜重装系统win8 大白菜教你
- 下一篇: stl中unordered_map 和