12-继承与多态(下)
一.重寫與重載
? ?
class Parent{public:virtual void func(){cout<<" void func()"<<endl;}virtual void func(int i){cout<<" void func(int i)"<<endl;}virtual void func(int i,int j){cout<<" void func(int i,int j)"<<endl;}};class Child:public Parent { public:virtual void func(int a,int b){cout<<" void func(int a,int b)"<<endl;}virtual void func(int i,int j,int k){cout<<" void func(int i,int j,int k)"<<endl;} };? ? 函數(shù)重載:
? ? ? ? ? ?(1)必須在同一類中,也就是在同一個作用域中。
? ? ? ? ? ?(2) 子類無法重載父類的函數(shù)。父類同名函數(shù)被覆蓋
? ? ? ? ? ? ? 如:?c.func();//錯誤,編譯只是?
? ? ? ? ? ?(3)重載是在編譯期間依據(jù)參數(shù)類型和個數(shù)決定調(diào)用函數(shù)的
? ? 函數(shù)重寫:
? ? ? ? ? ? (1) 必須發(fā)生在父類與子類之間
? ? ? ? ? ? (2) 而且父類與子類中的函數(shù)必須有全然同樣的原型。
? ? ? ? ? ? (3) 使用 virtual 聲明之后能顧產(chǎn)生多態(tài)
? ? ? ? ? ? (4) 多態(tài)是在執(zhí)行期間依據(jù)詳細對象的類型決定調(diào)用函數(shù)的
? ? 對照: 一個是在編譯期間決定的,一個是在執(zhí)行期間決定的,所以重載的效率還是比重寫的效率高。
?
二. 對虛函數(shù)的理解
? ? ?C++中多態(tài)的實現(xiàn)原理
? ? ? ? ?(1) 當類中聲明虛函數(shù)時,編譯器會在類中生成一個虛函數(shù)表
? ? ? ? ?(2) ?虛函數(shù)表是一個存儲類成員函數(shù)指針的數(shù)據(jù)結(jié)構(gòu)
? ? ? ? ?(3) ?虛函數(shù)表是由編譯器自己主動生成與維護的
? ? ? ? ?(4) ?virtual 成員函數(shù)會被編譯器放入虛函數(shù)表中
? ? ? ? ?(5) 存在虛函數(shù)時。每一個對象中都有一個指向虛函數(shù)表的指針。 ? ??
?
void run(Parent* p) {p->func(1,2); }? ? ? ? ? ? ? ?通過虛函數(shù)表指針VPTR調(diào)用重寫函數(shù)是在程序執(zhí)行時進行的,因此須要通過尋址操作才干確 ? ? ? ?定真正的應(yīng)該調(diào)用的函數(shù)。
而普通成員函數(shù)是在編譯時就確定了調(diào)用的函數(shù)。
在效率上。虛函數(shù) ? ? ? ? ? ?的效率要低的多。
? ? 注意: 處于效率的考慮,沒有必要把全部的成員函數(shù)都聲明為虛函數(shù)。
? ?對象中VPTR指針什么時候被初始化的?
? ? ? ? (1) 對象在創(chuàng)建的時候由編譯器對VPTR指針進行初始化。
? ? ? ? (2) 僅僅有當對象的構(gòu)造全然結(jié)束后VPTR的指向才終于確定
? ? ? ? (3) 父類對象的VPTR指向父類虛函數(shù)表
? ? ? ? (4) 子類對象的VPTR指向子類虛函數(shù)表
class Parent { public:Parent(){this->func();} virtual void func(){cout<<"virtual void Parent::func()"<<endl;} };class Child:public Parent { public:Child(){func();}void func(){cout<<"void Child::func()"<<endl;} };int main() {Child p; p.func();return 0; }
? ? ?結(jié)論: 構(gòu)造函數(shù)中調(diào)用虛函數(shù)無法實現(xiàn)多態(tài)
三. 純虛函數(shù)
? ? ?面向?qū)ο蟮某橄箢?/span>
? ? ? ? ?(1) 抽象類可用于表示現(xiàn)實世界中的抽象概念
? ? ? ? ?(2) 抽象類是一種僅僅能定義類型,而不能產(chǎn)生對象的類
? ? ? ? ?(3) 抽象類僅僅能被繼承并重寫相關(guān)函數(shù)
? ? ? ? ?(4) 抽象類的直接特征是純虛函數(shù)
? ? ? 說明: 純虛函數(shù)僅僅聲明函數(shù)原型,不定義函數(shù)體的虛函數(shù)。
? ? 抽象類與純虛函數(shù)
? ? ? ? ? (1) 抽象類不能用于定義對象
? ? ? ? ? (2) 抽象類僅僅能用于定義指針和引用
? ? ? ? ? (3) 抽象中的純虛函數(shù)必須被子類重寫
class Shape { public:virtual double area()=0; };
? ? area是純虛函數(shù), =0 告訴編譯器這個函數(shù)有益僅僅聲明不定義。
class Shape { public:virtual double area() = 0; };class Rectangle : public Shape {double m_a;double m_b; public:Rectangle(double a, double b){m_a = a;m_b = b;}double area(){return m_a * m_b;} };class Circle : public Shape {double m_r; public:Circle(double r){m_r = r;}double area(){return 3.14 * m_r * m_r;} };void area(Shape* s) {cout<<s->area()<<endl; }int main(int argc, char *argv[]) {Rectangle rect(2, 3);Circle circle(4);area(&rect);area(&circle);return 0; }
小結(jié):
? ? ? (1) 函數(shù)重載與函數(shù)重寫不同
? ? ? (2) 多態(tài)是通過虛函數(shù)實現(xiàn)的
? ? ? (3) 虛函數(shù)在效率上會有影響
? ? ? (4) 抽象類是通過純虛函數(shù)實現(xiàn)的。 ? ??
總結(jié)
以上是生活随笔為你收集整理的12-继承与多态(下)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SSH 端口修改
- 下一篇: android网络请求 post