中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

做界面的網(wǎng)站廣州網(wǎng)站優(yōu)化方案

做界面的網(wǎng)站,廣州網(wǎng)站優(yōu)化方案,網(wǎng)站如何解析,鄭州網(wǎng)站建設(shè)最低價(jià)一、多態(tài)的概念 1.1、多態(tài)的概念 多態(tài):多種形態(tài),具體點(diǎn)就是去完成某個(gè)行為,當(dāng)不同的對(duì)象去完成時(shí)會(huì)產(chǎn)生出不同的狀態(tài)。 舉個(gè)例子:比如買票這個(gè)行為,當(dāng)普通人買票時(shí),是全價(jià)買票;學(xué)生買票時(shí)&am…

一、多態(tài)的概念

1.1、多態(tài)的概念

多態(tài):多種形態(tài),具體點(diǎn)就是去完成某個(gè)行為,當(dāng)不同的對(duì)象去完成時(shí)會(huì)產(chǎn)生出不同的狀態(tài)。

舉個(gè)例子:比如買票這個(gè)行為,當(dāng)普通人買票時(shí),是全價(jià)買票;學(xué)生買票時(shí),是半價(jià)買票;軍人
買票時(shí)是優(yōu)先買票。

1.2、多態(tài)的分類

多態(tài)分為靜態(tài)多態(tài)和動(dòng)態(tài)多態(tài)

1)靜態(tài)多態(tài),也稱為靜態(tài)綁定或前期綁定(早綁定):函數(shù)重載和函數(shù)模板實(shí)例化出多個(gè)函數(shù)(本質(zhì)也是函數(shù)重載)。靜態(tài)多態(tài)也稱為編譯期間的多態(tài),編譯器在編譯期間完成的,編譯器根據(jù)函數(shù)實(shí)參的類型(可能會(huì)進(jìn)行隱式類型轉(zhuǎn)換),可推斷出要調(diào)用那個(gè)函數(shù),如果有對(duì)應(yīng)的函數(shù)就調(diào)用該函數(shù),否則出現(xiàn)編譯錯(cuò)誤。

2)動(dòng)態(tài)多態(tài),也稱為動(dòng)態(tài)綁定或后期綁定(晚綁定):在程序運(yùn)行期間,根據(jù)具體拿到的類型確定程序的具體行為,調(diào)用具體的函數(shù),即運(yùn)行時(shí)的多態(tài)。在程序執(zhí)行期間(非編譯期)判斷所引用對(duì)象的實(shí)際類型,根據(jù)其實(shí)際類型調(diào)用相應(yīng)的方法。

  1. 父類指針或引用指向父類,調(diào)用的就是父類的虛函數(shù)
  2. 父類指針或引用指向子類,調(diào)用的就是子類的虛函數(shù)

二、多態(tài)的定義及實(shí)現(xiàn)

2.1、多態(tài)的構(gòu)成條件

多態(tài)是在不同繼承關(guān)系的類對(duì)象,去調(diào)用同一函數(shù),產(chǎn)生了不同的行為。比如Student繼承了
Person。Person對(duì)象買票全價(jià),Student對(duì)象買票半價(jià)。

在繼承中要構(gòu)成多態(tài)還有兩個(gè)條件:

1. 必須通過基類的指針或者引用調(diào)用虛函數(shù)

2. 被調(diào)用的函數(shù)必須是虛函數(shù),且派生類必須對(duì)基類的虛函數(shù)進(jìn)行重寫

class Person //成人
{public:virtual void fun(){cout << "全價(jià)票" << endl; //成人票全價(jià)}
};
class Student : public Person //學(xué)生
{public:virtual void fun() //子類完成對(duì)父類虛函數(shù)的重寫{cout << "半價(jià)票" << endl;//學(xué)生票半價(jià)}
};
void BuyTicket(Person* p)
{p->fun();
}int main()
{Student st;Person p;BuyTicket(&st);//子類對(duì)象切片過去BuyTicket(&p);//父類對(duì)象傳地址
}

2.2、虛函數(shù)

虛函數(shù):即被virtual修飾的類成員函數(shù)稱為虛函數(shù)。

class Person {
public:virtual void BuyTicket() { cout << "買票-全價(jià)" << endl;}
};

2.3、虛函數(shù)的重寫

虛函數(shù)的重寫(覆蓋):派生類中有一個(gè)跟基類完全相同的虛函數(shù)(即派生類虛函數(shù)與基類虛函數(shù)的
返回值類型、函數(shù)名字、參數(shù)列表完全相同)
,稱子類的虛函數(shù)重寫了基類的虛函數(shù)。

class Person {
public:virtual void BuyTicket() { cout << "買票-全價(jià)" << endl; }
};
class Student : public Person {
public:virtual void BuyTicket() {cout << "買票-半價(jià)" << endl; }/*注意:在重寫基類虛函數(shù)時(shí),派生類的虛函數(shù)在不加virtual關(guān)鍵字時(shí),雖然也可以構(gòu)成重寫(因
為繼承后基類的虛函數(shù)被繼承下來了在派生類依舊保持虛函數(shù)屬性),但是該種寫法不是很規(guī)范,不建議
這樣使用*//*void BuyTicket() { cout << "買票-半價(jià)" << endl; }*/};
void Func(Person& p)
{ p.BuyTicket(); 
}
int main()
{Person ps;Student st;Func(ps);Func(st);return 0;
}

虛函數(shù)重謝的兩個(gè)特例:

1、協(xié)變(基類與派生類虛函數(shù)返回值類型不同)

派生類重寫基類虛函數(shù)時(shí),與基類虛函數(shù)返回值類型不同。即基類虛函數(shù)返回基類對(duì)象的指
針或者引用,派生類虛函數(shù)返回派生類對(duì)象的指針或者引用時(shí),稱為協(xié)變.

class A{};
class B : public A {};
class Person {
public:virtual A* f() {return new A;}
};
class Student : public Person {
public:virtual B* f() {return new B;}
};

2、析構(gòu)函數(shù)的重寫(基類與派生類析構(gòu)函數(shù)的名字不同)

如果基類的析構(gòu)函數(shù)為虛函數(shù),此時(shí)派生類析構(gòu)函數(shù)只要定義,無論是否加virtual關(guān)鍵字,
都與基類的析構(gòu)函數(shù)構(gòu)成重寫,雖然基類與派生類析構(gòu)函數(shù)名字不同。雖然函數(shù)名不相同,
看起來違背了重寫的規(guī)則,其實(shí)不然,這里可以理解為編譯器對(duì)析構(gòu)函數(shù)的名稱做了特殊處
理,編譯后析構(gòu)函數(shù)的名稱統(tǒng)一處理成destructor。

class Person {
public:virtual ~Person() {cout << "~Person()" << endl;}
};
class Student : public Person {
public:virtual ~Student() { cout << "~Student()" << endl; }
};
// 只有派生類Student的析構(gòu)函數(shù)重寫了Person的析構(gòu)函數(shù),下面的delete對(duì)象調(diào)用析構(gòu)函
數(shù),才能構(gòu)成多態(tài),才能保證p1和p2指向的對(duì)象正確的調(diào)用析構(gòu)函數(shù)。
int main()
{Person* p1 = new Person;Person* p2 = new Student;delete p1;delete p2;return 0;
}

2.4、override 和 final

?final:修飾虛函數(shù),表示該虛函數(shù)不能再被重寫

class Car
{
public:virtual void Drive() final {}
};
class Benz :public Car
{
public:virtual void Drive() {cout << "Benz-舒適" << endl;}
};

override: 檢查派生類虛函數(shù)是否重寫了基類某個(gè)虛函數(shù),如果沒有重寫編譯報(bào)錯(cuò)。

class Car{
public:virtual void Drive(){}
};
class Benz :public Car {
public:virtual void Drive() override {cout << "Benz-舒適" << endl;}
};

2.5、重載、覆蓋(重寫)、隱藏(重定義)的·對(duì)比


三、抽象類

3.1、抽象類概念

在虛函數(shù)的后面寫上 =0 ,則這個(gè)函數(shù)為純虛函數(shù)。包含純虛函數(shù)的類叫做抽象類(也叫接口
類),抽象類不能實(shí)例化出對(duì)象。派生類繼承后也不能實(shí)例化出對(duì)象,只有重寫純虛函數(shù),派生
類才能實(shí)例化出對(duì)象。純虛函數(shù)規(guī)范了派生類必須重寫,另外純虛函數(shù)更體現(xiàn)出了接口繼承。

class Car
{
public:virtual void Drive() = 0;
};
class Benz :public Car
{
public:virtual void Drive(){cout << "Benz-舒適" << endl;}
};
class BMW :public Car
{
public:virtual void Drive(){cout << "BMW-操控" << endl;}
};
void Test()
{Car* pBenz = new Benz;pBenz->Drive();Car* pBMW = new BMW;pBMW->Drive();
}

3.2、接口繼承和實(shí)現(xiàn)繼承

普通函數(shù)的繼承是一種實(shí)現(xiàn)繼承,派生類繼承了基類函數(shù),可以使用函數(shù),繼承的是函數(shù)的實(shí)
現(xiàn)。虛函數(shù)的繼承是一種接口繼承,派生類繼承的是基類虛函數(shù)的接口,目的是為了重寫,達(dá)成
多態(tài),繼承的是接口。所以如果不實(shí)現(xiàn)多態(tài),不要把函數(shù)定義成虛函數(shù)。

四、多態(tài)的實(shí)現(xiàn)原理

「多態(tài)」的關(guān)鍵在于通過基類指針或引用調(diào)用一個(gè)虛函數(shù)時(shí),編譯時(shí)不能確定到底調(diào)用的是基類還是派生類的函數(shù),運(yùn)行時(shí)才能確定。

4.1、虛函數(shù)表

class A
{
public:int i;virtual void Print() { } // 虛函數(shù)
};class B
{
public:int n;void Print() { }
};int main()
{A a;B b;cout << sizeof(a) << "," << sizeof(b);return 0;
}

A對(duì)象當(dāng)中除了i成員外,實(shí)際上還有一個(gè)指針_vfptr放在對(duì)象的前面(有些平臺(tái)可能會(huì)放到對(duì)象的最后面,這個(gè)跟平臺(tái)有關(guān))。

對(duì)象中的這個(gè)指針叫做虛函數(shù)表指針,簡(jiǎn)稱虛表指針,虛表指針指向一個(gè)虛函數(shù)表,簡(jiǎn)稱虛表,每一個(gè)含有虛函數(shù)的類中都至少有一個(gè)虛表指針。

虛表當(dāng)中存儲(chǔ)的就是虛函數(shù)的地址,因?yàn)楦割惍?dāng)中的Func1和Func2都是虛函數(shù),所以父類對(duì)象b的虛表當(dāng)中存儲(chǔ)的就是虛函數(shù)Func1和Func2的地址。

通過上面的知識(shí)鋪墊,發(fā)現(xiàn)一下幾個(gè)問題:

1. 派生類對(duì)象d中也有一個(gè)虛表指針,d對(duì)象由兩部分構(gòu)成,一部分是父類繼承下來的成員,虛表指針也就是存在部分的另一部分是自己的成員。

2. 基類b對(duì)象和派生類d對(duì)象虛表是不一樣的,這里我們發(fā)現(xiàn)Func1完成了重寫,所以d的虛表
中存的是重寫的Derive::Func1,所以虛函數(shù)的重寫也叫作覆蓋,覆蓋就是指虛表中虛函數(shù)
的覆蓋。重寫是語法的叫法,覆蓋是原理層的叫法。


3. 另外Func2繼承下來后是虛函數(shù),所以放進(jìn)了虛表,Func3也繼承下來了,但是不是虛函
數(shù),所以不會(huì)放進(jìn)虛表。


4. 虛函數(shù)表本質(zhì)是一個(gè)存虛函數(shù)指針的指針數(shù)組,一般情況這個(gè)數(shù)組最后面放了一個(gè)nullptr。


5. 總結(jié)一下派生類的虛表生成:a.先將基類中的虛表內(nèi)容拷貝一份到派生類虛表中 b.如果派生類重寫了基類中某個(gè)虛函數(shù),用派生類自己的虛函數(shù)覆蓋虛表中基類的虛函數(shù) c.派生類自己新增加的虛函數(shù)按其在派生類中的聲明次序增加到派生類虛表的最后。


6. 虛函數(shù)存在哪的?虛表存在哪的?

虛函數(shù)存在虛表,虛表存在對(duì)象中。注意上面的回答的錯(cuò)的。注意虛表存的是虛函數(shù)指針,不是虛函數(shù),虛函數(shù)和普通函數(shù)一樣的,都是存在代碼段的,只是他的指針又存到了虛表中。另外對(duì)象中存的不是虛表,存的是虛表指針。

1、虛表指針在構(gòu)造函數(shù)階段(初始化列表)填入到對(duì)象中,虛表則是在編譯時(shí)就生成好了。
2、虛表里面放的是虛函數(shù)地址,虛函數(shù)和普通函數(shù)一樣,編譯完成以后,都是放在代碼段中。
3、一個(gè)類中所有的虛函數(shù),都會(huì)放在虛表中。
4、子類會(huì)將父類的虛表拷貝一份,然后用重寫的虛函數(shù)地址覆蓋掉原來虛表中的函數(shù)地址,因此虛函數(shù)的重寫,也叫虛函數(shù)的覆蓋。
?

http://m.risenshineclean.com/news/58443.html

相關(guān)文章:

  • wordpress 瀏覽量排序b2b網(wǎng)站推廣優(yōu)化
  • 做外貿(mào)的物流網(wǎng)站有哪些天津百度推廣排名優(yōu)化
  • 大胡子wordpress主題南昌seo優(yōu)化
  • 做外貿(mào)網(wǎng)站可以收付款嗎拉人注冊(cè)給傭金的app
  • 網(wǎng)站seo好學(xué)嗎營(yíng)銷方案案例范文
  • 現(xiàn)在哪些網(wǎng)站做外貿(mào)的好做拉新人拿獎(jiǎng)勵(lì)的app
  • 電子商務(wù)網(wǎng)站建設(shè)評(píng)估工具有哪些360搜索首頁(yè)
  • 西安網(wǎng)站建設(shè)市場(chǎng)虛擬主機(jī)搭建網(wǎng)站
  • 臨安建設(shè)投標(biāo)網(wǎng)站教育培訓(xùn)機(jī)構(gòu)有哪些
  • 新網(wǎng)站做seo地方網(wǎng)站建設(shè)
  • pc端移動(dòng)端網(wǎng)站開發(fā)太原網(wǎng)站快速排名提升
  • 濰坊網(wǎng)站制作 熊掌號(hào)臨汾網(wǎng)絡(luò)推廣
  • 為什么做網(wǎng)站更新注冊(cè)網(wǎng)站域名
  • 好域名做網(wǎng)站手機(jī)免費(fèi)發(fā)布信息平臺(tái)
  • 惠州市做網(wǎng)站網(wǎng)絡(luò)營(yíng)銷的內(nèi)涵
  • 汨羅網(wǎng)站建設(shè)制作網(wǎng)站平臺(tái)
  • 如何外貿(mào)seo網(wǎng)站建設(shè)外鏈工具
  • 博物館網(wǎng)站建設(shè)方案報(bào)價(jià)關(guān)鍵詞優(yōu)化分析工具
  • 公司宣傳冊(cè)設(shè)計(jì)與制作模板seo免費(fèi)課程
  • 在美國(guó)注冊(cè)一個(gè)網(wǎng)站 大陸做銷售網(wǎng)址推薦
  • 自己做網(wǎng)站現(xiàn)實(shí)么網(wǎng)站設(shè)計(jì)就業(yè)
  • 沒網(wǎng)站能不能cpc廣告點(diǎn)擊賺錢做關(guān)鍵詞優(yōu)化排名的步驟
  • 開發(fā)網(wǎng)頁(yè)系統(tǒng)一般多少錢windows優(yōu)化大師官網(wǎng)
  • 中學(xué)生旅游網(wǎng)站開發(fā)的論文怎么寫外鏈seo推廣
  • 都昌網(wǎng)站建設(shè)seo可以從哪些方面優(yōu)化
  • 企業(yè)網(wǎng)站推廣設(shè)計(jì)網(wǎng)站優(yōu)化推廣
  • 個(gè)人網(wǎng)站怎么做支付寶接口google推廣妙招
  • wordpress主題生成seo這個(gè)行業(yè)怎么樣
  • 做爰網(wǎng)站美女東莞今日頭條最新消息
  • 網(wǎng)站建設(shè)怎么樣真正免費(fèi)建站