揭秘继承技术之虚函数
生活随笔
收集整理的這篇文章主要介紹了
揭秘继承技术之虚函数
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
虛函數(shù)
調(diào)用虛函數(shù)時(shí)函數(shù)行為將根據(jù)對(duì)象所屬類的不同而變化。
父類指針或引用指向子類對(duì)象時(shí),可訪問子類重寫方法( virtual函數(shù))但無(wú)法訪問在父類中沒有定義的子類方法和數(shù)據(jù)成員。
#include <iostream>using namespace std;class Super { public:Super(){}virtual void where(){cout<<"there is Super"<<endl;} };class Sub :public Super { public:Sub(){}virtual void where(){cout<<"there is Sub"<<endl;}void what(){cout<<"what?";} };int main() {Sub sub;Super* ptr = ⊂Super &ref = sub;sub.where();ptr->where();ref.where();return 0; }運(yùn)行結(jié)果:
?
通過ptr和ref訪問的where()均為子類方法,無(wú)法訪問子類的what()方法。
?
所有析構(gòu)函數(shù)都應(yīng)該聲明為虛函數(shù)(至少祖先類的析構(gòu)函數(shù)應(yīng)聲明為virtual)
一個(gè)函數(shù)被聲明為virtual即使在它子類中沒有顯式的指出該函數(shù)依然是virtual。
如果父類的析構(gòu)函數(shù)沒有聲明為virtual,當(dāng)delete一個(gè)實(shí)際指向子類對(duì)象的父類指針時(shí),析構(gòu)函數(shù)調(diào)用鏈將被破壞。
#include <iostream>using namespace std;class Something { public:Something(){cout <<"1";}~Something(){cout<<"1";} };class Super : public Something { public:Super(){cout<<"2";}~Super(){cout<<"2";} };class Sub :public Super { public:Sub(){cout<<"3";}~Sub(){cout<<"3";} };int main() {Super* ptr = new Sub;delete ptr;return 0; }運(yùn)行結(jié)果:
將Something的析構(gòu)函數(shù)聲明為virtual后,結(jié)果就為“123321”了。
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/baiyideng/p/3601452.html
總結(jié)
以上是生活随笔為你收集整理的揭秘继承技术之虚函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux ASLR的实现
- 下一篇: spring-自动加载配置文件\使用属性