c++ 構(gòu)造函數(shù)中調(diào)用虛函數(shù)的實(shí)現(xiàn)方法
我們知道:C++中的多態(tài)使得可以根據(jù)對(duì)象的真實(shí)類型(動(dòng)態(tài)類型)調(diào)用不同的虛函數(shù)。這種調(diào)用都是對(duì)象已經(jīng)構(gòu)建完成的情況。那如果在構(gòu)造函數(shù)中調(diào)用虛函數(shù),會(huì)怎么樣呢?
有這么一段代碼:
class A
{
public:
A ():m_iVal(0){test();}
virtual void func() { std::cout<<m_iVal<<‘ ';}
void test(){func();}
public:
int m_iVal;
};
class B : public A
{
public:
B(){test();};
virtual void func()
{
++m_iVal;
std::cout<<m_iVal<<‘ ';
}
};
int main(int argc ,char* argv[])
{
A*p = new B;
p->test();
return 0;
}
輸出: 0 1 2
也就是說(shuō),在構(gòu)造函數(shù)中調(diào)用虛函數(shù),調(diào)用的是正在構(gòu)造的類中的虛函數(shù),而不是子類的虛函數(shù)。
理一下程序。new了一個(gè)B對(duì)象,首先要調(diào)用基類構(gòu)造函數(shù),也就是A類的構(gòu)造函數(shù)。調(diào)用test(),再調(diào)用虛函數(shù)func(),這時(shí)候用的是基類版本。之后再調(diào)用子類B的構(gòu)造函數(shù),這時(shí)調(diào)用的是子類虛函數(shù)func()。至于最后一次調(diào)用func(),根據(jù)多態(tài),調(diào)用的是真實(shí)虛函數(shù)。
以上就是小編為大家?guī)?lái)的c++ 構(gòu)造函數(shù)中調(diào)用虛函數(shù)的實(shí)現(xiàn)方法全部?jī)?nèi)容了,希望大家多多支持腳本之家~
相關(guān)文章
使用pybind11封裝C++結(jié)構(gòu)體作為參數(shù)的函數(shù)實(shí)現(xiàn)步驟
這篇文章主要介紹了用pybind11封裝C++結(jié)構(gòu)體作為參數(shù)的函數(shù)實(shí)現(xiàn)步驟,本文分步驟通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02
C++實(shí)現(xiàn)學(xué)生選課系統(tǒng)
C++語(yǔ)言設(shè)計(jì)實(shí)現(xiàn)五子棋
VC使用編譯時(shí)間作為版本號(hào)標(biāo)識(shí)的方法
C語(yǔ)言開發(fā)實(shí)現(xiàn)井字棋及電腦落子優(yōu)化示例詳解
對(duì)C++默認(rèn)構(gòu)造函數(shù)的一點(diǎn)重要說(shuō)明
c++標(biāo)準(zhǔn)庫(kù)讀寫ini文件的實(shí)現(xiàn)示例

